当我这样给予时:
int main()
{
int a =123;
char *p =(char*)&a;
printf("%d\n",*p);
++p;
printf("%d\n",*p);
++p;
printf("%d\n",*p);
++p;
printf("%d\n",*p);
}
Run Code Online (Sandbox Code Playgroud)
我有输出像
123
0
0
0
Run Code Online (Sandbox Code Playgroud)
但我们这样给了:
int main()
{
int a =1234;
char *p =(char*)&a;
printf("%d\n",*p);
++p;
printf("%d\n",*p);
++p;
printf("%d\n",*p);
++p;
printf("%d\n",*p);
}
Run Code Online (Sandbox Code Playgroud)
我输出为
-46
4
0
0
Run Code Online (Sandbox Code Playgroud)
我对系统如何将值(123/1234)存储在4个字节的变量a中感到困惑.如果它小于127,则第一个字节占据我们作为输入的值(iw 123).
但是如果该值大于127,则变量a的第一个和第二个字节存储不同的值.请解释它是如何工作的?
如果你将1234存储在一个整数(4个字节)中,它只需要两个字节来存储1234,因为1234小于65535所以剩下的两个字节用0填充.第一个字节打印-46因为它是使用带符号的字符指针取消引用所以它以1234的二进制形式打印最低有效字节中可用数据的有符号值.
4字节的1234二进制将是
0000 0000, 0000 0000, 0000 0100, 1101 0010
(byte 3) (byte 2) (byte 1) (byte 0)
Run Code Online (Sandbox Code Playgroud)
对于字节0,符号位被置位,所以它是两个补码并且放置一个负号,这只是-46
字节1的十进制值为4
字节2和字节3保持未用于存储1234,因此它打印0.