我正在尝试读取C中int的单个字节,但由于某种原因会发生以下情况:
int x = -128;
//this prints 128 255
printf("%d %d\n", ((unsigned char *) (&x))[0], ((unsigned char *) (&x))[3]);
不应该打印128 128而不是吗?
答案 0 :(得分:2)
它是特定于机器的,取决于处理器的endianness。
(查看endianness wikipage,它解释得非常好; x86-64是小端的。)
答案 1 :(得分:2)
-128
在两个补码中的表示是
11111111 11111111 11111111 10000000 // 4 bytes
系统的endianness表示字节存储在内存中的顺序。 Big-endian表示最高有效字节,即第一个字节,存储在最小地址中,而小端表示最低有效字节,即最后一个字节存储在最小地址中。你的机器是小端。因此,字节的顺序是
10000000 11111111 11111111 11111111 // 4 bytes
因此,((unsigned char *) (&x))[0]
表示第一个字节100000000
,并计算为128
。 ((unsigned char *) (&x))[3]
表示评估为11111111
的最后一个字节255
。
答案 2 :(得分:0)
Should it not print 128 128 instead?
-128表示为
11111111 11111111 11111111 10000000
[3] [2] [1] [0]
当你在小端机器上说((unsigned char *) (&x))[0]
时,它会打印出来
128你试图将(10000000)投射到unsigned char
这是128而(unsigned char *) (&x))[3]
会打印255,这是1的全部。