原码、补码和反码 & 逻辑位移和算术位移


1. 无符号数、补码、反码、原码

对于向量x=[xw-1,xw-2,...,x0], 其中xi取0或1

无符号数                  

 

 

 

 原码:

最高位表示符号位,其余位表示值 。例如,[1111 1111, 0111 1111] = [-127,127] 

  反码:      

正数的补码是其本身,而负数的补码是在原码的基础上,最高位不变,其他位取反。

   补码:

正数的补码是其本身,而负数的补码是在原码的基础上,最高位不变,其他位取反,最后加1(即在反码的基础上加1)。


 

 2. 区分补码、原码和反码的意义

使用原码时,人脑可以理解最高位代表正负号的含义,但是对于机器来说,在识别数字的同时还有区分出正负号,会对机器带来极大的负担。

于是使用补码和反码来帮助机器理解如何将符号位加入运算。

反码的出现时为了解决原码做减法的问题

例如计算:1-1 = 1+(-1)=[0000 0001]+[1000 0001] = [0000 0001]+[1111 1110] = [1111 1111] = [1000 0000] = -0

然而,在实际中并没有对-0和+0进行区分,因而引入了补码来解决0的符号问题

例如计算:1-1 = 1+(-1)=[0000 0001]+[1000 0001] = [0000 0001]+[1111 1111] = [0000 0000] = [0000 0000] = 0

除此之外:(-1)+(-127) = [1000 0001]+[1111 1111] = [1111 1111]+[1000 0001] = [1000 0000] = -128 

从而使用补码,还能多表示一个最低数。因而,使用原码和反码表示的范围为[-127,127],而使用补码时范围为[-128,127]


3. 移位运算

对于左移操作(<<)而言。不管是有符号数还是无符号数,x<<k,都是对于x而言,丢弃最高K位,并在右边末端添上k个0。

而对于右移操作(>>)而言,则分为逻辑右移和算术右移。其中逻辑右移在左端补k个0,而算术右移则是在左端补上k个最高位。

操作
x [1001 0101]
x << 4 [0101 0000]
x >> 4(逻辑右移) [0000 1001]
x >> 4 (算术右移) [1111 1001]

 (以下二进制均为补码表示,即移位是用补码进行的(这是因为计算机中用的是补码表示))

 

 

左移操作相当于乘以2的k次方;而右移操作相当于除以2的k次方 (均只适用于被舍弃的高位不含1的情况)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM