如果我们给变量a = 123第一个字节赋值123但是如果我们给a = 1234那么其他值就会到来

AAD*_*A.R 0 c memory int

当我这样给予时:

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的第一个和第二个字节存储不同的值.请解释它是如何工作的?

Aji*_*nan 6

如果你将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.