恶补一下原码反码补码,忘记的童鞋也可以看看
未经本人同意不得用于获取积分等。
转载请注明,http://blog.youkuaiyun.com/tryhl/article/details/42098871,谢谢!!!!
欢迎加入 java学习分享群:316297243,一起学习
1.回顾计算机表示数字
原码、反码、补码的诞生都是为了表示数据,只不过是三种不同的编码方式而已。
十进制15,-15大家都知道代表什么,如果直接把这个呈现给计算机,计算机肯定是醉了,不知道这是什么。因为计算机只认识0,1这两个数字。
数字在计算机中是用机器数表示的(一个数在计算机中的二进制表示形式,叫做这个数的机器数),在计算机用一个数的最高位存放符号,正数为0,负号为1。
例如:+3机器数表示为 00000011,-3表示为10000011。
+3的第一位0是表示正数,0000011表示值3,所以为+3
-3的第一位是1表示负数,0000011表示值3,所以为-3.
2.原码 反码 补码的定义
原码:符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。其实上面的表示一样。
例如:[+1]原码=[0000 0001] [-1]原码=[1000 0001]
因为第一位是符号位,所以8位的二进制数范围为
-27 + 1到27 - 1 即 -127到127
原码我们人最容易识别和判断,计算机也能够识别。
按理说反码和补码就不应该在出现在这个世界上,但是它们既然出现了,肯定有它们的道理。
反码:整数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
其范围也是-27 + 1到27 - 1 即 -127到127
例如:[+1]原码=[0000 0001] [+1]原码=[0000 0001]
[-1]原码=[1000 0001] [-1]反码=[1111 1110]
如果一个表示负数的反码人脑是无法直接判断出来负数的值。
为什么会有反码呢?因为在计算机中进行加减的需求,大家都知道让计算机去识别减法会相当的复杂,但是如果识别加法会比较容易。但是减法是可以用加法来表示的。
例如:
利用原码进行加减:
1-1=1+(-1)=[0000 0001]原码 +[1000 0001]原码=[1000 0010]原码=-2显然不对。
利用反码进行加减:
1-1=1+(-1)=[0000 0001]反码 +[1111 1110]反码=[1111 1111]反码=-0
计算的结果是正确的,因为按照我们的理解-0就是0,带符号的0是没有任何意义的。所以[0000 0000]反码、 [1111 1111]反码都表示0,可想而知一个数字可以有两种表达形式,显然是不行的。所以引入了补码。
补码:正数的补码是其本身,负数的补码是在其原码基础上,符号位不变,其余各位取反,最后加1(也就是在反码的基础上加1)。
因为当时负数时加1,所以
1-1=1+(-1)=[0000 0001]补码 +[1111 1111]补码=[0000 0000]补码=0
2-1=2+(-1)=[0000 0010]补码 +[1111 1111]补码=[0000 0001]补码=1
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)
使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].
参考文章:http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html