内存中的指针和整数表示
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 语言中以逻辑方式呈现给您的。而不是物理组件是如何排列的。
我正在学习 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 语言中以逻辑方式呈现给您的。而不是物理组件是如何排列的。