关于补码的一篇短文
首先要记住一点:计算机中数字是以二进制的补码形式来表示的。
计算机中表示的二进制数又称为“机器数”,机器数带有符号,符号位就用这个二进制数的最高位表示,其中0表示正数,1就表示负数。举例来说:十进制的8用二进制来表示是为00001000(这里假设用一个字节共8位表示)
即8=00001000;-8=10001000
当然谈到补码总离不开原码,反码等这些概念,别急,先来了解一下原码等概念。
原码:
一个正数的原码当然就是他本身转换成二进制的形式:
如:8=00001000
而一个负数就只要符号位置1其余为该负数的绝对值的二进制形式: 如:-8=10001000
(题外话)
我们知道java中一个byte类型的数值是用一个字节表示的,那么我们就很容易知道他的取值范围是[11111111~01111111]即[-128~127],总共也就256个数字,大家如果仔细去看过jdk源代码的话,他把这256个数字都缓存起来了,于是我们可以猜猜下面这两个表达式的值应该为True还是False
Byte b1 = 127;
Byte b2 =127;
System.out.print(b1==b2); //true
Integer i1 = 128;
Integer i2 = 128;
System.out.print(i1==i2);//false
反码:分为两种情况,正数的反码就是他本身了,负数的反码就是除了最高位的符号位保持1不变之外其他位取反。
如:8=00001000
-8=11110111
补码:同样正数的补码也是其本身,负数就是在原码的基础上除符号位之外的位取反,然后最低位加1.
如:8 = 00001000
-8 = 11110111+1=11111000
小结:正数的原码=反码=补码,负数稍微复杂点,原码就高位为1,其他位和该负数对应的正数的原码一样。反码和补码都是建立在原码的基础上,反码就是除高位不变之外其他为取反即可。而补码同样是最高位不变其余位取反再最后一位加1.
总结:为什么计算机要用补码来表示数字呢?我们不妨来举例说明,计算机中做加减乘除是很复杂的,如果减法也可当加法用那就可以省事多了.
比如:1-1=1+(-1),
如果用源码做加法00000001原+10000001原=10000010原=-2显然结果不对。
要是用反码:00000001反+11111110反 = 11111111反=-0然而负数0没什么意义。如是出现了补码:00000001补+11111111补=00000000补=0,这个就是我们需要的结果