2014-04-01 91 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。