进制,原码VS补码

进制

十,八,十六进制=>二进制

十进制=>二进制:辗转相除取余,10除2商5余0,5除2商2余1,2除2商1余0,1除2商0余1,So,10d=1010b
八进制=>二进制:每1位八进制数字对应3位二进制数字,So,012=001_010b
十六进制=>二进制:每1位十六进制数字对应4位二进制数字,So,0x2f=0010_1111b

二进制=>十,八,十六进制

二进制=>十进制:乘方作和,So, 1010b=2^3+2^1=10d
二进制=>八进制:每3位二进制数字对应1位八进制数字,So,001_010b=012
二进制=>十六进制:每4位二进制数字对应1位十六进制数字,So,0010_1111b=0x2f

原码,反码,补码

原码就是在我们上面直接计算得到二进制数字前面加上符号位(0非负1负)
反码负数的反码是原码真值01反转,非负数和原码一样
补码负数的补码是反码+1,非负数的补码和反码和原码一样
Q:计算机中的数字都是用补码的形式存储,WHY?
A:

  1. 假设用4位二进制存储有符号整数,用原码的规则转码,是1111(-2^3-1)~1001(-1)~1000(-0)~0000(+0)~0001(+1)~0111(+2^3-1),你看,这里竟然有+0和-0!用补码的规则转码,会是1000(-2^3)~1001(-2^3-1)~1111(-1)~0000(0)~0001(1)~0111(+2^3-1),补码利用了"溢出"的原理实现了"-0"和"+0"的"统一",按照补码的规则,原码1000的补码是1111+1--溢出--=0000,和+0一样一样的!所以按照补码表示数字的话,0000就是0。
  2. 补码1111对应的原码是1001,即-1,补码1001对应的原码是1111,即-2^3-1,重点来了:补码1000没有对应的原码!所以补码的规则使0只有一种表达方式,但却使原码中表示-0的组合1000无所表达,所以人们就规定,补码1000表示((原码0111对应数字+1)的相反数),即-2^3,至此同样的位数,补码的解读方式比原码的方式多了一个数
  3. 使用补码的更重要的意义在于"让计算机忽略符号位",我们都知道+1+(-1)=0,但是如果用原码解读,0001+1001不为0,如果用补码解读,1111+0001=(1)0000=0,以后计算机进行计算的时候就不需要区分是否是正数+负数了

综上,补码的好处有:

  1. +0和-0统一
  2. 扩大表示的范围
  3. 计算机做加法不再需要考虑符号位

Tips:

  • 一个数的补码的补码就是这个数的原码
上一篇:HDU 1874 畅通工程续(模板题——Floyd算法)


下一篇:近期公共祖先(LCA)——离线Tarjan算法+并查集优化