1 c pointers dereference output
我遇到了以下程序,无法理解输出是-109 1683怎么回事.输出结果怎么样?
#include <stdio.h>
int main()
{
int k = 1683;
char *a = (char *)&k;
int *l = &k;
printf("%d " , *a);
printf("%d" , *l);
}
Output is : -109 1683
Run Code Online (Sandbox Code Playgroud)
如何取消引用指针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.