内存中的指针和整数表示

Pointer and integer representation in memory

我正在学习 c 中的指针,我有这个程序,我从某本书中拿来作为例子。

void print_bytes(void *start, size_t size);

int main(int argc, char *argv[])
{
    int val = 42;
    print_bytes(&val ,sizeof(val));

    return 0;
}

void print_bytes(void *start, size_t size)
{
    int i = 0;

    for(i = 0; i < size; i++)
    {
         printf("%02X ", *((unsigned char *)start + i));
    }
}

我正在尝试以 hexadecimal 格式打印每个字节的值,该格式由函数 print_bytes.

中的 start pointer 变量指向

据我所知,当 integers 变量存储在内存中时,变量以二进制格式存储。

如果我 运行 代码,这是我的分析: 假设整数变量的大小是 4 bytes (32 bits) 那么 如果内存中有一个整数值 42 那么内存中的表示是:

42 仅适合内存中字节的前 8 位表示。

二进制:00000000 00000000 00000000 00101010

所以如果我 运行 我得到的代码 2A。到目前为止输出是正确的。

如果内存中有一个大于42的整数值,假设3000(这肯定需要一个以上的字节来表示内存中的二进制值)那么内存中的表示是:

二进制:00000000 00000000 00001011 10111000

如果我 运行 我得到的代码 'B8 0B 00 00' 在我看来是错误的 BB 80 00 00.

请有人解释一下哪里出了问题,我试图解决这个问题已经好几个小时了,但毫无头绪。

先谢谢你了。我会感谢每一个答案,并努力从中学习。

简而言之,字节顺序不适用于位字节。

无论您在哪个平台上,低位都在右边。你可以这么说,因为右移 (>>) 总是会减少一个值,而不会增加它。

您的平台是小端。因此二进制值 00000000 00000000 00001011 10111000(以约定的最高有效位优先格式编写)存储为 10111000 00001011 00000000 00000000.

请注意,位不只反转字节。把它变成十六进制给我们:

10111000 00001011 00000000 00000000
B   8    0   B    0   0    0   0

脚注:未定义位的物理存储方式。我们谈论的是计算机内存是如何在 C 语言中以逻辑方式呈现给您的。而不是物理组件是如何排列的。