我遇到了以下程序,无法理解输出是-109 1683
怎么回事.输出结果怎么样?
#includeint main() { int k = 1683; char *a = (char *)&k; int *l = &k; printf("%d " , *a); printf("%d" , *l); } Output is : -109 1683
如何取消引用指针a
给我-109
?
我希望它能读取四字节整数的第一个字节.
1683
在二进制表示中是00000000 00000000 00000110 10010011
.所以读取第一个字节意味着输出应该是0 1683
.在幕后发生了什么,我听到了一些关于架构字节序的内容,但无法遵循它.
整数1683
等于0x00000693
(int
在现代系统上通常为32位).在一个小端系统(如x86和x86-64)上,它在内存中布局就像
+------+------+------+------+------+------+------+------+ | 0x93 | 0x06 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | +------+------+------+------+------+------+------+------+
初始化指针a
时,指向该序列中的第一个字节,即包含该值的字节,这是0x93
取消引用时得到的值a
.
现在谈谈价值如何0x93
变成的问题-109
.有两个原因:一个是char
你的编译器signed
(如果char
是有符号或无符号类型,它依赖于编译器).第二个原因是因为二进制补码算法.二进制补码是一种能够在二进制机器上编码有符号整数的方法,如现代计算机.
基本上,对于单个8位字节,通过将(无符号)十进制值减去256(2 8)得到负值.无符号十进制值0x93
是147
,和147 - 256
等于-109
.