c - 将字符数组视为整数 - Learn C the Hard Way 额外学分

标签 c arrays pointers

在 Zed Shaw 的“艰难地学习 C”中,练习 9 (http://c.learncodethehardway.org/book/ex9.html) 中有一个我觉得很有趣的额外学分问题。他定义了一个 4 字符数组,并要求读者弄清楚如何将该数组用作 4 字节整数。

在这一点上,我知道足够危险,我认为答案是这样的:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char name[4] = {'A'};

    int *name_int;
    name_int = &name;
    printf("%d", *name_int);

    return 0;
}

我的想法是,如果我创建一个值为数组地址的 int 指针,则 int 类型将使用该地址中的数据字节,然后是接下来的 3 个可用数据字节。以我有限的理解,我的印象是 int 和数组都会以相同的方式使用内存:从任意内存地址开始而不是按顺序使用下一个地址,等等。

但是,这不是我所期望的输出:我得到了“A”的 ascii 值。在我看来,这似乎表明我的解决方案不正确,我对内存处理方式的理解不正确,或者两者兼而有之。

如何完成这个小技巧,我哪里出错了?我希望通过更好地理解指针和引用的工作方式以及内存的存储和使用方式来摆脱这一点。

谢谢!

最佳答案

您遇到了数字的小端与大端表示。

让我们看一下用于表示 4 字节整数的 4-btyes 的值。

+----+----+----+----+
| N1 | N2 | N3 | N4 |
+----+----+----+----+

In a big-endian representation, these 4 bytes represent:

N1*2^24 + N2*2^16 + N3*2^8 + N4

在小端表示中,这 4 个字节表示:

N1 + N2*2^8 + N3*2^16 + N4*2^24

在你的情况下。

N1 = 'A' (65 decimal)
N2 = 0
N3 = 0
N4 = 0

因为您得到的整数值是 65,所以您有一个小字节序表示。如果您想将这些数字视为大端表示,您可以使用以下内容:

#include <stdio.h>

int main(int argc, char *argv[])
{
   int i;
   char nameString[4] = {'A'};
   int name = 0;

   for ( i = 0; i < 4; ++i )
   {
      name = (name << 8) + nameString[i];
   }

   printf("%d\n", name);
   printf("%X\n", name);

   return 0;
}

我用上面的代码得到的输出:

1090519040
41000000

关于c - 将字符数组视为整数 - Learn C the Hard Way 额外学分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23001591/

相关文章:

c++ - 这是某种指针错误吗?

c++ - 为什么 for 循环的条件是可选的,而 while 循环的条件不是可选的?

c - 如何在创建多维数组后立即为其分配多个值 - 在 C 中?

javascript - 如何操作数组对象并创建新数组

c++ - 在 Xcode 和 Eclipse 中输出 char 数组

c++ - ELI5 : What is the data type of `int *p[]`

c - 使用 C++11 智能指针作为 C 函数参数

比较输入的字符串

python - PyObject_CallMethod 泄漏/段错误

c - 哪个C单元测试框架?