文章目录
- 真值(有正负号)和机器数(0正1负)
- 原码
- 整数
- 小数
- 补码
- 负数的补数
- 正数的补数
- [y]~补~ ==> [-y]~补~
- 反码
- 小结
- 移码
- 移位运算
- 加减法运算
- 溢出判断
真值(有正负号)和机器数(0正1负)
无符号数与真值and机器数都不是一个概念
移码不是有符号数 ,它没有符号位,他是用于比较大小
原码
整数
n位整数,
最大值为,2ⁿ-1
最小时绝对值取最大,最小为-(2ⁿ-1)
小数
最大值:0.1111—》0.1111+0.0001=1
最小值:-0.1111
小数原码的0有两种表示,这个和整数一样 假设数值位为4 +0:0.0000 -0:1.0000
8位原码表示的范围是0——255,一共是256个数
范围是-127到+127【因为有一位是符号位】
不过比若说5位原码0,0000和1,0000都表示0,是同一个数!
补码
负数的补数
正数的补数
负数的补数=负数+模
对于负数,如果它的符号位 不用 01表示,
那么模=2n,n表示数值位个数
如果负数的符号位 用 01表示
那么模=2n+1,n表示数值位个数,1为符号位
假设n为4,
最大值:1111,也就是24-1=15
最小值:10000,也就是24+1+(-24)=1,0000
【这个1可以当做符号位,代表负数,
也可以当做数值位,代表16。
总的说就是他可以表示一个最小的负数-16】
补码里面没有 -0
因为 -0:1,0000在我们补码里面不再是 -0,而表示-16
负小数的补码2的由来:
正小数的补码:0.0000
负小数的补码,符号位向前走一位:10.0000,所以2进制(10)=2
原码和补码相互转化:除符号位,按位取反,末尾+1
[y]补 ==> [-y]补
反码
小结
补码和反码,机器数越大,对应的真值越大
移码
移码是为了方便计算机比较两个正负数之间补码的大小关系
比如21的补码:0,10101
- 21的补码:1,01011
单纯比较机器数,-21的补码>21的补码 这显然是不对的。
仔细观察发现,这两个正负数其实只要符号位互换,计算机就可以比较他们的大小了
正数的移码:符号位由0变1就行了
负数的移码:它的补码符号位取反
比如二进制:-10100
补码:1,01100
移码: 2^5^ -10100=0,01100
[X]移<===>[X]补:符号位取反!
移位运算
左移三位,丢掉左边的1,对应的真正就不准确了
左移三位,丢掉左边的1,对应的真正就不准确了
补码:
左移三位,丢掉左边的0,对应的真正就不准确了 因为补码是在原码的基础上按位取反+1得到的,丢掉1相当于是原码的0,不影响准确性
补码:
右移一位,丢掉右边的0,不影响结果,左边补1【补得是符号位】 右移两位,丢掉一个1,影响精度,左边填1【补得是符号位】
反码:
移掉0会影响结果
移调1,相当于原码的0,不影响结果
加减法运算
上图证明了:[A+B]补==[A]补+[B]补
先求出A+B的值
再就出【A补+B补】的值
【A+B】的补码正好和【A补+B补】的值相等
这样,当计算机在求A+B时
可以先求【A+B】的补,也就是【A补+B补】的值 然后再通过补码转原码
[x]补+[y]补=0.1001+0.1011=1.0100
把1.0100向右移动一位:0.1010,也就是 10/16,再乘2,正好才是结果的20/16
溢出判断