話不多說,直接進入正題
byte i =127;System.out.println(++i); //很意外的會輸出 -128
推測代碼執(zhí)行的結果,分析結果產生的原因。
答:
先看計算機二進制拓展:
在計算機內,定點數有3種表示法:原碼、反碼和補碼
[原碼]就是二進制定點表示法,即最高位為符號位,“0”表示正,“1”表示負,其余位表示數值的大小。
[反碼]表示法規(guī)定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
[補碼]表示法規(guī)定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
也就是說:
- 正數的補碼就是其本身。
- 負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
對于負數, 補碼表示方式也是人腦無法直觀看出其數值的. 通常也需要轉換成原碼在計算其數值.
正數:
(p)正數的反碼和補碼都與原碼相同
負數:
(p)負數的反碼、補碼與原碼不同,負數的反碼:原碼中除去符號位,
其他的數值位取反,0變1,1變0。負數的補碼:反碼+1
正題:基本數據類型 byte: 1 byte = 1字節(jié) = 8bit (位)
最高位是符號位。
即最大值是01111111(十進制表示形式為127),即此正數為01111111。
那最小值相反就是負數, 負數的符號位是1 , 即 10000000(-128)。
01111111+1 = 10000000

image.png