我想閱讀用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。
你是什麼樣的電腦?小尾巴?大端? –