我想阅读用C int的单个字节,但由于某些原因会发生以下情况:铸造诠释unsigned char型
int x = -128;
//this prints 128 255
printf("%d %d\n", ((unsigned char *) (&x))[0], ((unsigned char *) (&x))[3]);
如果它不打印128 128呢?
我想阅读用C int的单个字节,但由于某些原因会发生以下情况:铸造诠释unsigned char型
int x = -128;
//this prints 128 255
printf("%d %d\n", ((unsigned char *) (&x))[0], ((unsigned char *) (&x))[3]);
如果它不打印128 128呢?
在二进制补码的-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
。当你在小端机的情况下说((unsigned char *) (&x))[0]
它是机器特定的,取决于处理器的endianness。
(窥视endianness Wiki页面,它是很好的解释。x86-64是小端)
Should it not print 128 128 instead?
-128表示为
11111111 11111111 11111111 10000000
[3] [2] [1] [0]
,将打印 128,因为你正在尝试投放(10000000),以unsigned char
这是128和(unsigned char *) (&x))[3]
将打印255全是1。
你是什么样的电脑?小尾巴?大端? –