Java中符號位擴充套件

2021-09-09 04:27:53 字數 1182 閱讀 6521

第乙個例子:

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位二...