計算機中,int類型占用4個字節,byte類型占用1個字節;
當int類型強轉為byte類型時,計算機會截取最后的八位(1個字節);
由於計算機存儲數據時,都是以補碼的形式進行存儲。
然而,我們通常看到的數卻是計算機存儲的補碼先轉換成反碼,后轉換成原碼,再轉換成十進制呈現的。
原碼、反碼與補碼的關系:
正數: 原碼 = 反碼 = 補碼
負數: 原碼取反 = 反碼(符號位不變); 反碼 + 1 = 補碼(符號位上的進位舍棄)
舉例:
int a = 128,轉換成二進制形式是0000 0000 0000 0000 0000 0000 1000 0000,
由於正數的原碼=反碼=補碼,因此計算機存儲的是0000 0000 0000 0000 0000 0000 1000 0000。
int a = -128,轉換成二進制形式是1000 0000 0000 0000 0000 0000 1000 0000,
由於負數的原碼、反碼與補碼的轉換關系是:原碼取反=反碼(符號位不變),反碼+1=補碼;
反碼:1111 1111 1111 1111 1111 1111 0111 1111
補碼:1111 1111 1111 1111 1111 1111 1000 0000
因此,在計算機中存儲的是1111 1111 1111 1111 1111 1111 1000 0000
int a = 128;
byte b = (byte) a; // b=-128
首先,由上述第一個例子得知,128在計算機中存儲的補碼形式為0000 0000 0000 0000 0000 0000 1000 0000,
此時強制轉換成byte類型的數據時,計算機會自動截取最后的八位(1個字節)1000 0000,
由補碼最高位為1得知,轉換后的數據是一個負數,
根據負數補碼求反碼,我們可以得到該數的反碼是1111 1111,
根據負數反碼求原碼,可得到該數的原碼是1000 0000