我正在学习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
内容。
请有人解释什么是错的,我正试图解决这个问题几个小时但没有任何线索。
谢谢你。我会感激每一个答案并尝试向他们学习。
答案 0 :(得分:0)
简短字节序不适用于仅位字节。
无论你在哪个平台上,低位都在右边。你可以这么说,因为右移(>>
)总会减少一个值,永远不会增加它。
您的平台是小端的。因此,二进制值00000000 00000000 00001011 10111000
(以常规最重要的数字第一格式编写)存储为10111000 00001011 00000000 00000000
。
请注意,这些位不会仅反转字节。通过将其转换为十六进制给我们:
10111000 00001011 00000000 00000000
B 8 0 B 0 0 0 0
脚注:未定义物理存储位的方式。我们正在谈论如何在C中逻辑地向您呈现计算机内存。不是如何安排物理组件。