-
先了解二进制运算的几个概念
- 正数的反码和补码都是自己
- 负数的反码:符号位除外,其他位取反
- 负数的补码:其反码末位+1
-
实例(byte类型): 10-1=9
- 目前所知cpu的所有运算都是建立在二进制的加法基础上,为了复用这套加法算法避免多设计一套半导体来实现减法,所以简化减法变成了带符号位的的加法(eq: 10-1=10+(-1)),同时规定负数要转化为补码再进行加法运算,
- 反码好处就是负数可以带着符号位一起参与运算了
10-1=10+(-1) = 0000,1010 + 1111,1111 = 0000,1001=9
10的二进制:0000,1010
-1的二进制:1000,0001
-1的补码: 1111,1111
-
所以byte类型的取值范围
- 最大值: 0111,1111 = 127
最小值: 1111,1111 = -127 (感觉那里不对劲!) 二进制中其实存在 +0,-0的概念,并且规定-0就是最小值,在byte中-0: 1000,0000 = -128 ,也就是 -0 = -128 ,这个1既是符号位也是数值位
- 最小值:-0: 1000,0000 = -2^8 = -128
代码验证
@Test
@DisplayName("byte最大值和最小值")
void test2() {
// 0b标识二进制
byte a = (byte) 0b00000010;
byte b = (byte) 0b00000001;
System.out.println("2-1=" + (a - b));
byte max = (byte) 0b01111111;
byte min = (byte) 0b10000000;
System.out.println("byte最大值:" + max);
System.out.println("byte最小值:" + min);
}
结果输出:
2-1=1
byte最大值:127
byte最小值:-128
扩展
二进制规定-0是最小值
- 所以 Integer占4字节=32位,所以最小值是 -0 = -2^(32-1)
- Integer最大值是: 2^(32-1)-1