|
|
|
@ -0,0 +1,95 @@
|
|
|
|
|
首先提几个概念: 原码,反码,补码
|
|
|
|
|
|
|
|
|
|
### 原码是什么?
|
|
|
|
|
|
|
|
|
|
原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码
|
|
|
|
|
|
|
|
|
|
举例说明:
|
|
|
|
|
|
|
|
|
|
int类型的 3 的原码是 11B(B表示二进制位), 在32位机器上占四个字节,那么高位补零就得:
|
|
|
|
|
|
|
|
|
|
00000000 00000000 00000000 00000011
|
|
|
|
|
|
|
|
|
|
int类型的 -3 的绝对值的二进制位就是上面的 11B 展开后高位补零就得:
|
|
|
|
|
|
|
|
|
|
10000000 00000000 00000000 00000011
|
|
|
|
|
|
|
|
|
|
但是原码有几个缺点,零分两种 +0 和 -0 。很奇怪是吧!还有,在进行不同符号的加法运算或者同符号的减法运算的时候,不能直接判断出结果的正负。你需要将两个值的绝对值进行比较,然后进行加减操作 ,最后符号位由绝对值大的决定。于是反码就产生了。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 反码是什么 ?
|
|
|
|
|
|
|
|
|
|
正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反
|
|
|
|
|
|
|
|
|
|
举例说明:
|
|
|
|
|
|
|
|
|
|
int类型的 3 的反码是
|
|
|
|
|
|
|
|
|
|
00000000 00000000 00000000 00000011
|
|
|
|
|
|
|
|
|
|
和原码一样没什么可说的
|
|
|
|
|
|
|
|
|
|
int类型的 -3 的反码是
|
|
|
|
|
|
|
|
|
|
11111111 11111111 11111111 11111100
|
|
|
|
|
|
|
|
|
|
除开符号位 所有位 取反
|
|
|
|
|
|
|
|
|
|
解决了加减运算的问题,但还是有正负零之分,然后就到补码了
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
补码是什么?
|
|
|
|
|
|
|
|
|
|
正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.
|
|
|
|
|
|
|
|
|
|
还是举例说明:
|
|
|
|
|
|
|
|
|
|
int类型的 3 的补码是:
|
|
|
|
|
|
|
|
|
|
00000000 00000000 00000000 00000011
|
|
|
|
|
|
|
|
|
|
int类型的 -3 的补码是
|
|
|
|
|
|
|
|
|
|
11111111 11111111 1111111 11111101
|
|
|
|
|
|
|
|
|
|
就是其反码加1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
最后总结一下:
|
|
|
|
|
|
|
|
|
|
#### 正数的反码和补码都与原码相同。
|
|
|
|
|
|
|
|
|
|
#### 负数的反码为对该数的原码除符号位外各位取反。
|
|
|
|
|
|
|
|
|
|
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
各自的优缺点:
|
|
|
|
|
|
|
|
|
|
原码最好理解了,但是加减法不够方便,还有两个零。。
|
|
|
|
|
|
|
|
|
|
反码稍微困难一些,解决了加减法的问题,但还是有有个零
|
|
|
|
|
|
|
|
|
|
补码理解困难,其他就没什么缺点了
|
|
|
|
|
|
|
|
|
|
喔日,说到这里,估计都晕了,举个栗子把。
|
|
|
|
|
|
|
|
|
|
5的原码是 00000000000000000000000000000101(四个字节,32位(byte))
|
|
|
|
|
|
|
|
|
|
5的原码和反码,补码都一样。
|
|
|
|
|
|
|
|
|
|
-5的原码是原码除符号位以外所有的位取反 ,10000000000000000000000000000101
|
|
|
|
|
|
|
|
|
|
-5的反码就是原码符合外取反得到反码11111111111111111111111111111010
|
|
|
|
|
|
|
|
|
|
-5的补码就是反码加一得到补码11111111111111111111111111111011
|
|
|
|
|
|
|
|
|
|
最后补充一句,负数一般用补码来计算。
|
|
|
|
|
|
|
|
|
|
|