为什么Number子类的表示范围是[-2^n ~ 2^n -1]
2020-11-25 本文已影响0人
Divenier
这就要结合补码的生成过程来看了。
以范围最小的byte
为例,8个bit能够区分的不同数字上限是256个,但这256个数中间,必须包含0;
依照首位区分正负的规定,8个bit能表示的最大的正数就是0111_1111b
,也就是127;同时,最小的负数应该是1111_1111b
(-127),但1000_0000
能表示的-0
已经没有意义了,0000_0000
已经把0表示的很好了,因此把它拎出来表示-128,使得8个bit能表示的数字范围变成了[-128,127];
来看-128的补码生成过程:
//-128:
-1000_0000(仅作示意)
1111_1111(除符号位外全部取反)
1000_0000(末尾加一 并进位)(补码)
-128的补码是特殊的,原是表示-0的,因此-128没有对应的反码和原码