原码:在数值前直接加一符号位的表示法
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
反码 : 正数的反码与原码相同。
负数的反码,符号位为“1”,数值部分按位取反。
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
补码 : 正数的补码和原码相同
负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。
[+7]补= 0 0000111 B
[-7]补= 1 1111001 B
在计算机系统中,数值一律用补码来表示和存储。使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理。
exp:
20的二进制补码 = 00010100 25的二进制补码 = 00011001
按位取反后: 11101011 按位取反后: 11100110
末尾加 1 后: 11101100 末尾加 1 后: 11100111
-20的二进制补码 = 11101100 -25的二进制补码 = 11100111
按位取反后: 11101011 按位取反后: 11100110
末尾加 1 后: 11101100 末尾加 1 后: 11100111
-20的二进制补码 = 11101100 -25的二进制补码 = 11100111
-20 11101100
+(-25) = + 11100111
-45 111010011
超出的最高位去掉后 = 11010011
-45 的补码刚好是 11010011
20 00010100
+(-25) = + 11100111
-5 11111011
-5 的补码刚好是 11111011
+(-25) = + 11100111
-5 11111011
-5 的补码刚好是 11111011
按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1 有方法
-5 的原码 10000101
注意溢出的问题:
byte的取值范围 八位
无符号位 0~255 (因为计算机是从0开始计算的而不是1)
有符号位 -128 ~ +127
0000 0000 = +0
没有 1000 0000 = -0
1000 0000=-128 计算机以补码形式存储 这个“1”既是符号位,也是数值位。
1)(+72)+(+98)=
0 1 0 0 1 0 0 0 B +72
01 1 0 0 0 1 0 B +98
1 0 1 0 1 0 1 0 B
11010110 -86
2)(-83)+(-80)=
1 0 1 0 1 1 0 1 B -83
1 0 1 1 0 0 0 0 B -80
0 1 0 1 1 1 0 1 B +93