2.1 无符号数和有符号数
2.1.1 无符号数
没有符号的数,其实就是非负数。在计算机中用字节码表示,目前最常用的是八位和十六位的。
![](https://file.jishuzhan.net/article/1705206752359747586/a4b160e9e5294c0c8914a5dc12558b1a.png)
2.1.2 有符号数
将正负符号数字化,0代表 + ,1代表 - ,并把代表符号的数字放在有效数字前,就组成了有符号数。
1. 机器数和真值
我们接下来要用到的真值都指的是带符号的二进制数。
机器数是相对于真值而言的,下面要讲的原码、补码、反码和移码都属于机器数。
![](https://file.jishuzhan.net/article/1705206752359747586/754f7935f5954d8c80ebd1662b496027.png)
2. 原码表示法
原码,顾名思义,是机器数最原本的表示方法,原码包括两个部分,符号位和数值位,符号位用0和1代表这个数的正负,数值位就是真值的绝对值。
为了区别用原码表示的整数和小数,整数的符号位和数值位用逗号隔开,小数的则用小数点隔开。
原码的优点:表示简单,易于和真值转换。
原码的定义 -- 整数
![](https://file.jishuzhan.net/article/1705206752359747586/e5939dfc8acc4d41b5cf94fb4c964ab7.png)
原码的定义 -- 小数
原码可以表示的小数范围在-1和1之间,其他带小数的数可以用整数+小数这样的组合来表示。
![](https://file.jishuzhan.net/article/1705206752359747586/9a0f9ef99c724605b334c6a2f1f3108f.png)
例题
注意,在由原码求真值的题目中,若结果为正,那也得加一个 + 号!
![](https://file.jishuzhan.net/article/1705206752359747586/b4226915b5c54f0b9cf3ca05ef158a14.png)
![](https://file.jishuzhan.net/article/1705206752359747586/62733f7581634503a1e14ec736bef3ed.png)
3. 补码表示法
补的概念
取模为12的时候,+2等价于-10,-4等价于+8,+3等价于+15等价于+27。
在上面的例子里,-10的补数为+2,-4的补数为+8。并且正数的补数是其本身。
由此可以知道,只要确定了模,就可以为任何一个负数找到与其对应的正数,也就是补数,这样就方便进行运算,在对含有负数的式子进行加法运算时,可以先将负数取补数,最后取模即可。
补的结论
![](https://file.jishuzhan.net/article/1705206752359747586/a2d3d09d4a944200a97cce148f5a2a3f.png)
补码的定义 -- 整数
![](https://file.jishuzhan.net/article/1705206752359747586/07276e63f9664a248fc123c20288c7c8.png)
![](https://file.jishuzhan.net/article/1705206752359747586/5663d632482045f4a651d7324b0a5407.png)
补码的定义 -- 小数
用补码表示负的小数时,因为符号位要为1,所以应该模2,也就是用2减去真值,这样得到的结果里,符号位一定为1,数值位即为真值的补数。
要注意,2也得用二进制来表示!
![](https://file.jishuzhan.net/article/1705206752359747586/7488001eb663437583096859eced5809.png)
![](https://file.jishuzhan.net/article/1705206752359747586/56ddeb4ce54241a68ebf99afddd5e5f5.png)
变形补码 -- 双符号位补码
![](https://file.jishuzhan.net/article/1705206752359747586/1a7032d9b61d43709d5c4e647a22bcea.png)
![](https://file.jishuzhan.net/article/1705206752359747586/c750105352da451ebedc1b2212951aa3.png)
![](https://file.jishuzhan.net/article/1705206752359747586/523a3c9c59b7409e8b4dfc4f225fe816.png)
求补码的快捷方式
对正数来说,补码就是符号位加上真值本身,简单易求;
对负数来说,求补码则有快捷方式:
![](https://file.jishuzhan.net/article/1705206752359747586/92185d1abf0e44c392d0648fafb3c06f.png)
总而言之,就是符号位不变,数值位取反,末尾加一。
4. 反码表示法
反码通常是基于上面原码与补码转换的快捷方式,所需要的中间过渡。
由于正数不需要快捷方式,所以反码还是和原码补码一样,只有符号位和真值不同。
只有负数需要将全体数值位转换为相反的数。
反码的定义 -- 整数
![](https://file.jishuzhan.net/article/1705206752359747586/c27271b6d88746309deefe6c3081fd7a.png)
反码的定义 -- 小数
![](https://file.jishuzhan.net/article/1705206752359747586/11cb58e8ec2a4ce9820483ab5842b510.png)
![](https://file.jishuzhan.net/article/1705206752359747586/2911937a632b4b6088935990945518bc.png)
例题
![](https://file.jishuzhan.net/article/1705206752359747586/16fbc7c70c414f72930f6febae184ce7.png)
![](https://file.jishuzhan.net/article/1705206752359747586/69bf22f0fbf74fdeb8c969da2a244b2b.png)
5. 移码表示法
用原码和补码时很难一眼比出两个数的大小,这时候就需要使用移码了。
移码的定义
![](https://file.jishuzhan.net/article/1705206752359747586/af39f672781a428a94e692d609be53a3.png)
移码的特点
![](https://file.jishuzhan.net/article/1705206752359747586/d81f246eb3834119b27fc96d61cb5482.png)
同一个真值的移码和补码只差一个符号位。
![](https://file.jishuzhan.net/article/1705206752359747586/9bf6498293094688aa7eb9f7f5d0e2d1.png)
作业题知识点补充
1. 分数转换为二进制数
以 29/128 为例:
第一步
把分子和分母都转换为二进制,要表示为2的多少次。
那么分子表示为:2^4+2^3+2^2+2^0
那么分母呢:2^7
继续将他们写成分数形式:(2^4+2^3+2^2+2^0)/2^7。
接下来计算就好了,结果为:2^-3+2^-4+2^-5+2^-7。
第二步
讲一个小知识点:对于二进制数左移是放大2倍,右移是缩小2倍。
那么对于二进制1,我们右移得到0.1,缩小2倍。所以0.1代表1/2,即2-1。同理,0.01就是1/4,即2-2,以此类推。
有了这个基础,再看看上面的式子,不就是0.001+0.0001+0.000 01+0.000 0001。
用二进制加法计算出最后结果,即0.001 1101。
2. 无原码的特殊情况
补码为1.0000的真值为-1,但是没有原码,因为小数原码的范围如下:
![](https://file.jishuzhan.net/article/1705206752359747586/5ab3f10c44d241e08604600543914b3e.png)
可知,小数1和-1都没有原码。
补码为1,0000的真值为-16,但也没有原码,因为整数原码的范围如下:
![](https://file.jishuzhan.net/article/1705206752359747586/155b970771a046b682eef406b39b23b8.png)
当数值位有四位时,原码的取值只能小于+16。
3. 十六进制转换为二进制
每个十六进制数都代表四位二进制数,所以直接按位置转换即可。
0 ~ 9 都可以当成十进制数化为二进制数,只是不足的要补足至四位,而剩下的则如下表所示:
|------|-----|------|
| 十六进制 | 十进制 | 二进制 |
| A | 10 | 1010 |
| B | 11 | 1011 |
| C | 12 | 1100 |
| D | 13 | 1101 |
| E | 14 | 1110 |
| F | 15 | 1111 |
2.2 数的定点表示和浮点表示
2.1.1 定点表示
![](https://file.jishuzhan.net/article/1705206752359747586/cd7a71f52d6b4494b4707447bad5e3ee.png)
2.1.2 浮点表示
![](https://file.jishuzhan.net/article/1705206752359747586/42d537a6bf384de8bf89abb6e1c3bcd0.png)
规格化数:浮点数的尾数以1开头,例如0.110101。
1. 浮点数的表示形式
![](https://file.jishuzhan.net/article/1705206752359747586/024f1041632d48d5b4408477ac2575e5.png)
![](https://file.jishuzhan.net/article/1705206752359747586/f7e37d8bffb547ccbeb5bd58a75373ff.png)
2. 浮点数的表示范围
![](https://file.jishuzhan.net/article/1705206752359747586/49ec8439831d44e1b2fe6c7b8ab50e39.png)
3. 浮点数的规范化
![](https://file.jishuzhan.net/article/1705206752359747586/6f5e70f6987e4238a166beee96a64fe5.png)
2.2.3 定点数和浮点数的比较
- 当浮点机与定点机中的数其位数相同时,浮点数的表示范围比定点数大得多。(浮点机和定点记中的数都表示为机器数)
- 当浮点数为规格化数时,其精度远高于定点数。
- 浮点数运算分阶码和尾数部分,而且运算结果要求规格化。
- 在溢出的判断方法上,浮点数是对规格化的阶码进行判断,而定点数是对数值本身进行判断。
2.2.4 举例
![](https://file.jishuzhan.net/article/1705206752359747586/07b937acbeb94d7f960b60add41c4748.png)
![](https://file.jishuzhan.net/article/1705206752359747586/60a4f191bf2e481a93c3750bc934a604.png)
机器零
- 当浮点数尾数为0时,不论其阶码是多少,按机器零处理;
- 当浮点数阶码等于或小于它能表示的最小数时,不论尾数是多少,按机器零处理
2.2.5 IEEE 754 标准
![](https://file.jishuzhan.net/article/1705206752359747586/b230e723d1754419a6d8ad6759d39422.png)
S:数符号,表示浮点数的正负,0为正,1为负;
阶码(含阶符):实际上是偏移阶码,求得阶码需要用原来的阶数加上不同长度实数对应的偏移量
偏移量:短实数(32位)127,长实数(64)1023
尾数:要先化为"1.xx......xx"的形式,再把最高位的"1"省略,只列出小数点后面的数,不足23位的要用0补齐
![](https://file.jishuzhan.net/article/1705206752359747586/a292445dfded45d99c79275eafdde32b.png)
![](https://file.jishuzhan.net/article/1705206752359747586/1f6e5fd9d61448aa99a5c606a4d155e1.png)
2.3 定点运算
2.3.1 移位运算
1. 移位的意义
定点移位,就是小数点的绝对位置不动,其余的数字全部向左或向右移动;
左移时,绝对值增大;右移时,绝对值减小。
在计算机中整移位运算很有用,让移位和加减配合就可以实现乘除运算。
算术移位:有符号数的移位,数值位在移位,符号位不变。
逻辑移位:无符号数的移位。
2. 算术移位规则
机器数移位后的空位添补规则
![](https://file.jishuzhan.net/article/1705206752359747586/ffcccfecee1d40bbb711f69dfff7ea2f.png)
要注意,在算术移位中,移位前后符号位不变。
而逻辑移位中,左移时低位添0,高位丢弃;右移时高位添0,低位丢弃。
2.3.2 加减法运算
1. 补码加减运算公式
![](https://file.jishuzhan.net/article/1705206752359747586/844134d12f1c41f9bf18e388bf6437d5.png)
![](https://file.jishuzhan.net/article/1705206752359747586/52e51b60e62544e696a9ff85bde29b66.png)