You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.2 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

首先提几个概念: 原码,反码,补码 
### 原码是什么?
      原码就是早期用来表示数字的一种方式: 一个正数转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补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$
最后补充一句,负数一般用补码来计算。