第一节 补码的本质
-
大部分计算机存储整数都是按照补码表示法来进行存储的
-
1
用补码表示法存储过程:- 获取绝对值:
1
- 将绝对值转换为二进制:
1
- 根据数字在计算机中所占的位数(空间大小)在前面补0
- 假设大小为1个字节,在前面补7个0:
0000 0001
- 假设大小为1个字节,在前面补7个0:
- 判断符号:
- 符号为正,存储结束
- 符号为负,取其补码
- 获取绝对值:
-
-2
用补码表示法存储过程:- 获取绝对值:
2
- 将绝对值转换为二进制:
10
- 根据数字在计算机中所占的位数(空间大小)在前面补0
- 假设大小为1个字节,在前面补6个0:
0000 0010
- 假设大小为1个字节,在前面补6个0:
- 判断符号:
- 符号为负,取其补码:
1111 1110
- 获取绝对值:
-
处理器如何执行1 + (-2) ?
0000 0001
+1111 1110
=1111 1111
- 验证(补码表示法的逆运算):
- 根据最高位(符号位)判断正负:
1
为负 - 进行逆运算:
- 减1:
1111 1110
----> -2 - 取反:
0000 0001
----> 1
- 减1:
- 根据最高位(符号位)判断正负:
-
在使用补码表示法存储整数时,正数和负数所对应的规则不同:
- 正数:最终存储为二进制
- 负数:最终存储为二进制的补码
-
-2
在计算机中存储的值:-
8位:
1111 1110
-
16位:
1111 1111 1111 1110
-
32位:
1111 1111 1111 1111 1111 1111 1111 1110
-
-2
补码的本质:0-2的运算结果 -
1 + (-2) ----> 1 + (-2的补码) ----> 1 + (0 - 2)
-
第二节 有符号数和无符号数
- 8位存储单元
- 补码表示法的存储范围: -128 ---- 127
- 无符号表示法的存储范围: 0 ---- 255
- 无符号表示法正数的存储范围要远远大于补码表示法
- 原因:在存储单元大小相同的情况下,补码表示法要分出一半的空间用来存储负数,无符号表示法正数的存储范围是补码表示法的2倍
- 无符号表示法正数的存储范围要远远大于补码表示法
- DB 200 ----> 补码表示法 ----> 1100 1000 ----> 补码表示法的逆运算 ----> -56
- DB 200 ----> 无符号表示法 ----> 1100 1000 ----> 无符号表示法的逆运算 ----> 200
- 除法指令:
DIV
----> 无符号数IDIV
----> 有符号数- 举例:
Mov ax, 0x0400(被除数)
Mov bl, 200(除数)
div/idiv bl
- div : 0x0400 = 1024, 200 = 200, 结果为0x05 = 5
- idiv : 0x0400 = 1024, 200 = -56, 结果为0x12 = -18
- 好处:节省程序所占用的内存空间、提升程序执行效率
- 相同功能的指令被分为两种,一种可看作无符号数,一种可看作有符号数
- 只有极少数的指令被分解为两种进行解析,绝大部分指令都既能操作有符号数,又能操作无符号数,因此并未分为两种进行解析
- 原因:绝大多数指令无论从哪个角度解析数据,运算结果都正确
Mov al, 200
----> 存储结果:1100 1000add al, 1
----> 运算结果:1100 1001
- 无符号数的角度进行解析:
1100 1000
----> 200-
1
----> 1 1100 1001
----> 201- 200 + 1 = 201
- 有符号数角度进行解析:
1100 1000
----> -56-
1
----> 1 1100 1001
----> -55- -56 + 1 = -55
- 只有极少数的指令被分解为两种进行解析,绝大部分指令都既能操作有符号数,又能操作无符号数,因此并未分为两种进行解析
第三节 溢出标志位和进位标志位
-
溢出标志位:
OF
----> 有符号数 -
进位标志位:
CF
----> 无符号数 -
发生溢出 ---->
OF = 1
-
发生进位 ---->
CF = 1
-
如果运算结果(十进制)超出了存储单元的存储范围,那么:
OF = 1(有符号数)、CF = 1(无符号数)
- 存储范围会根据存储单元的存储大小而发生变化
mov al, 0xF0 add al, 0x78
(-128~127)
有符号数(0-255)
无符号数0xF0 1111 0000 -16 240 0x78 + 0111 1000 120 120 1 0110 1000 104 104(360) OF = 0 CF = 1(进位) -
(-128~127)
有符号数(0-255)
无符号数0xF0 1111 0000 -16 240 0x88 + 1000 1000 -120 136 1 0111 1000 120(-136) 120(376) OF = 1 CF = 1 (-128~127)
有符号数(0-255)
无符号数98 0110 0010 98 98 99 + 0110 0011 99 99 1100 0101 -59(197) 197(197) OF = 1 CF = 0 (-128~127)
有符号数(0-255)
无符号数98 0110 0010 98 98 99 - 0110 0011 99 99 1111 1111 -1(-1) 255(-1) OF = 0 CF = 1(借位) -
无论是有符号数还是无符号数,运算结果超出它的存储范围,得到的运算结果一定是错误的
-
从有符号数的角度来分析,运算结果超出存储范围,
OF = 1
-
从无符号数的角度来分析,运算结果超出存储范围,
CF = 1
-
当OF(有符号数)或CF(无符号数)的值 = 1时,此次运算会得到一个错误的结果