整数表示法
int整数的表示分成了两个部分
符号位 - 数值位
1000 0000 0000 0001
整数的第一位如果是1,那么这个整数就是负数,如果是0,则是正数。
后面的所有位,存储的都是该数的补码。
原码
将一个整数转换成二进制形式,就是其原码。例如short a = 6;
a 的原码就是
0000 0000 0000 0110
更改 a 的值a = -18;
此时 a 的原码就是,注意第一位是符号位
1000 0000 0001 0010
通俗的理解**,原码就是一个整数本来的二进制形式**。
反码
对于正数,它的反码就是其原码(原码和反码相同)
负数的反码是将原码中除符号位以外的所有位取反
例如short a = 6;
a 的原码和反码都是
0000 0000 0000 0110
更改 a 的值a = -18;
此时 a 的反码是
1111 1111 1110 1101
补码
对于正数,它的补码就是其原码(原码、反码、补码都相同);
负数的补码是其反码加 1。
例如short a = 6;
a 的原码、反码、补码都是
0000 0000 0000 0110
更改 a 的值a = -18,此时 a 的补码是
1111 1111 1110 1110
可以认为,补码是在反码的基础上打了一个补丁,进行了一下修正,所以叫“补码”。
总结:正数的原码、反码、补码完全一样,只有负数需要按照以上规则计算。
为什么用补码进行运算
5 + (-5) = 0
那么…5的某种码加(-5)的某种码,会不会恰好是0的某种码呢?
如果真的是,计算机中有上亿次计算,计算效率会大大提高,过程会极大的简化。
原码和的十进制结果是 -10,结果是错的,因为符号位没法直接相加
反码和是 11111111,对应十进制 -0 ,大家觉得-0还是0?
这样我们就有两种0,虽然不对,结果已经非常接近了!!
但是…每个二进制和十进制都是数的表示形式,是一一对应的。
01111111是不是也可以表示0,两种形式都表示0,那么是不是某个数不能被表示了…
补码和000000000,刚好是0,补码在加法器运算上具有独到的优势,不得不慨叹这个设计的精妙绝伦.