内存中的指针和整数表示

时间:2016-10-30 10:21:26

标签: c pointers binary endianness

我正在学习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));
    }
}

我正在尝试打印函数print_bytes中hexadecimal变量指向的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内容。

请有人解释什么是错的,我正试图解决这个问题几个小时但没有任何线索。

谢谢你。我会感激每一个答案并尝试向他们学习。

1 个答案:

答案 0 :(得分:0)

简短字节序不适用于仅位字节。

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

您的平台是小端的。因此,二进制值00000000 00000000 00001011 10111000(以常规最重要的数字第一格式编写)存储为10111000 00001011 00000000 00000000

请注意,这些位不会仅反转字节。通过将其转换为十六进制给我们:

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

脚注:未定义物理存储位的方式。我们正在谈论如何在C中逻辑地向您呈现计算机内存。不是如何安排物理组件。