第乙個例子:
byte b=-100;
b在記憶體中是以補碼的形式存貯的:
1001 1100
如果執行char c=(char)b;
如3樓企鵝先生所說:b要先變為int,這時增加的位全要用b的符號位填充(這就是符號擴充套件),變為:
1111 1111 1111 1111 1111 1111 1001 1100
下步是強制型別轉換,只保留了最低的兩個位元組:1111 1111 1001 1100。
如果執行char c=(char)(b&0xff),同樣b要轉為int ,同時符號位擴充套件:
1111 1111 1111 1111 1111 1111 1001 1100
再與0xff想與,
1111 1111 1111 1111 1111 1111 1001 1100&0000 0000 0000 0000 0000 0000 1111 1111
-----------------------------------------
0000 0000 0000 0000 0000 0000 1001 1100
再強轉為char,得: 0000 0000 1001 1100。這是乙個正數。
第二個例子:
int x = 0xf8;byte d = (byte)0xf8;
system.out.println(x);
system.out.println(d);
列印結果為:
248-8
這是因為0xf8是16進製制數,其對應的十進位制數為248,248並未超出int型別的取值範圍,故而列印結果為248.
而byte型別的取值範圍為-128 -- 127,所以當把0xf8賦給d時,需要進行強轉。
/*** * byte d = (byte)0xf8;
* * 原碼:0000 0000 0000 0000 0000 0000 1111 1000
* 強**1111 1000
* 反碼:1000 0111
* 補碼:1000 1000
* *
*/
而system.out.println()在列印的時候發現被列印的數為byte則會自動將其轉換為int,所以結果為-8。
零位擴充套件和符號位擴充套件
1 符號擴充套件 當用更多的記憶體儲存某乙個有符號數時,由於符號位位於該數的第一位,擴充套件之後,符號位仍然需要位於第一位,所以,當擴充套件乙個負數的時候需要將擴充套件的高位全賦為1 對於正數而言,符號擴充套件和零擴充套件是一樣的,因為符號位就是0 比如乙個用乙個8 位二進位制表示 1,則是 100...
有符號數的符號位擴充套件
char和int型別都是由符號數型別,char型別的變數佔據1個位元組的容量,int型別的變數佔據4個位元組的容量。那麼,把char型別變數賦給int型別變數,會有什麼問題產生?我們會很直觀地認為,把1個位元組大小的資料,放入4個位元組大小的容量,沒有任何問題啊!我們做如下的乙個測試例子 inclu...
C 中注意,零擴充套件和符號位擴充套件
首先,介紹一下兩種擴充套件的定義 符號擴充套件 當用更多的記憶體儲存某乙個有符號數時,由於符號位位於該數的第一位,擴充套件之後,符號位仍然需要位於第一位,所以,當擴充套件乙個負數的時候需要將擴充套件的高位全賦為1.對於正數而言,符號擴充套件和零擴充套件是一樣的,因為符號位就是0.比如乙個用乙個8位二...