2014-04-01 92 views
2

我想阅读用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呢?

+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。当你在小端机的情况下说((unsigned char *) (&x))[0]

2

它是机器特定的,取决于处理器的endianness

(窥视endianness Wiki页面,它是很好的解释。x86-64是小端)

0
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。