day3 微机运算基础
文章目录
- 1. 引言
- 2. 进位计数制
- 2.1 基本概念
- 2.2 常见进制
- 3. 不同进制之间的转换
- 3.1 其他进制转十进制
- 3.2 十进制转其他进制
- 3.3 二进制与八进制、十六进制的转换
- 4. 二进制编码
- 4.1 BCD码(Binary-Coded Decimal)
- 4.2 格雷码(Gray Code)
- 4.3 ASCII码
- 5. 二进制数的运算
- 5.1 算术运算
- 5.2 逻辑运算
- 6. 数的定点与浮点表示
- 6.1 定点数
- 6.2 浮点数(IEEE 754标准)
- 7. 带符号数的表示法
- 7.1 原码、反码、补码
- 7.2 补码的优势
- 7.3 溢出检测
- 8. 总结
1. 引言
微机运算基础是计算机科学和电子工程的核心内容。理解计算机如何表示和处理数据,是学习计算机体系结构、编程和数字逻辑设计的前提。本文将主要学习进位计数制、进制转换、二进制运算方法,以及数值的定点、浮点表示和带符号数的表示。
2. 进位计数制
2.1 基本概念
进位计数制是一种按进位规则表示数值的方法,其核心要素包括:
- 基数(Base):一个数位可用的字符或数码的个数,可用于区别不同数制(比如如十进制的基数为10,十六进制的基数为16)。
- 权值:每个数位代表的值为数码值乘以基数的幂次(如十进制数123中,1的权值为 1 0 2 10^2 102)。
几进制就是逢几进一,比如十进制数到10需要进位,八进制数到8需要进位。
2.2 常见进制
- 十进制(Decimal):基数为10,数码为0-9。
- 二进制(Binary):基数为2,数码为0和1,是计算机内部运算的基础。
- 八进制(Octal):基数为8,数码为0-7。
- 十六进制(Hexadecimal):基数为16,数码为0-9和A-F(A=10, B=11, …, F=15)。
以21为例,按照上述顺序,用这些进制分别进行表示:
方法一: 2 1 10 、 1010 1 2 、 2 5 8 、 1 5 16 21_{10} 、10101_2 、 25_8 、 15_{16} 2110、101012、258、1516
方法二: 21 H 、 10101 B 、 25 Q 、 15 H 21H、10101B、25Q、15H 21H、10101B、25Q、15H
方法三: 21 、 0 b 10101 、 0 o 25 、 0 x 15 21、0b10101、0o25、0x15 21、0b10101、0o25、0x15
方法一是下标的形式进行区分。
方法二是使用后缀加以区分,注意到八进制的后缀是Q,这是因为O与0很像,所以用Q代替O,当然有的地方还是以O作为后缀,不必过多纠结,按照上面人的要求即可。
方法三则是添加前缀进行区分。
3. 不同进制之间的转换
进制之间的转换方法总结于下图,可作为参考。
3.1 其他进制转十进制
因为十进制是人类最熟悉的数制,因此我们把原来进制按每一个位展开,在进行求和即可。
按权展开法:将每个数码乘以基数的幂次后求和。
示例:
- 二进制数 ( 1011.01 ) 2 = 1 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 + 0 × 2 − 1 + 1 × 2 − 2 = 11.2 5 10 (1011.01)_2 = 1×2^3 + 0×2^2 + 1×2^1 + 1×2^0 + 0×2^{-1} + 1×2^{-2} = 11.25_{10} (1011.01)2=1×23+0×22+1×21+1×20+0×2−1+1×2−2=11.2510
- 十六进制数 ( 3 A . F ) 16 = 3 × 1 6 1 + 10 × 1 6 0 + 15 × 1 6 − 1 = 58.937 5 10 (3A.F)_{16} = 3×16^1 + 10×16^0 + 15×16^{-1} = 58.9375_{10} (3A.F)16=3×161+10×160+15×16−1=58.937510
3.2 十进制转其他进制
十进制转换为其他进制,就类似于分组的思维,所以我们需要除以基数
- 整数部分:除基取余法(从下往上取余数)。
- 小数部分:乘基取整法(从上往下取整数)。
示例:将 25.37 5 10 25.375_{10} 25.37510转换为二进制:- 整数部分: 25 ÷ 2 = 12 25 ÷ 2 = 12 25÷2=12 余1 → ( 11001 ) 2 (11001)_2 (11001)2
- 小数部分: 0.375 × 2 = 0.75 0.375 × 2 = 0.75 0.375×2=0.75 取0 → 0.75 × 2 = 1.5 0.75 × 2 = 1.5 0.75×2=1.5 取1 → ( . 011 ) 2 (.011)_2 (.011)2
- 结果:
(
11001.011
)
2
(11001.011)_2
(11001.011)2
小数与正数取方向的要进行区分,可以简单记忆为:每一次运算出来的结果往“边缘”跑。
3.3 二进制与八进制、十六进制的转换
对于八进制和十六进制,可以观察到 8 = 2 3 、 16 = 2 4 8=2^3、16=2^4 8=23、16=24 ,也就是说3位二进制可对应1位的八进制,4位二进制就一位的十六进制。因此,我们可以沿着这个思路进行二进制到八进制与十六进制的转换。
- 二进制→八进制:每3位二进制为一组,转换为1位八进制(不足补零)。
- 二进制→十六进制:每4位二进制为一组,转换为1位十六进制。
示例:
( 10110110 ) 2 (10110110)_2 (10110110)2 → 分组为10 110 110
→ 八进制 ( 266 ) 8 (266)_8 (266)8
( 10110110 ) 2 (10110110)_2 (10110110)2 → 分组为1011 0110
→ 十六进制 ( B 6 ) 16 (B6)_{16} (B6)16
同样的,如果是八进制、十六进制转换为二进制,则是反过来即可。
- 八进制 → 二进制: 1对3
- 十六进制 → 二进制: 1对4
示例:
八进制 ( 266 ) 8 (266)_8 (266)8 →分组为2 6 6
→ 转为10 110 110
→ ( 10110110 ) 2 (10110110)_2 (10110110)2
十六进制 ( B 6 ) 16 (B6)_{16} (B6)16 →分组B 6
→ 对应1011 0110
→ ( 10110110 ) 2 (10110110)_2 (10110110)2
4. 二进制编码
计算机只能识别二进制数,因此我们需要把所有的信息都一一对应到二进制编码中,而上述的二进制码仅仅代表数字之间的运算,对于字符,键盘的输入等都需要有二进制代码,所以设计了一些有标准的,符合人的直觉的二进制编码。
4.1 BCD码(Binary-Coded Decimal)
用4位二进制表示1位十进制数(如 2 9 10 = 0010 100 1 B C D 29_{10} = 0010\ 1001_{BCD} 2910=0010 1001BCD),适用于需要精确十进制运算的场景(如金融计算)。像这种设计,把十进制的每一位分开写成二进制,就不会很费脑筋。
需要注意的是,占一位十进制的数字只能是
0~9
,因此对应的4位二进制范围也只能是0000~1001
,至于1010~1111
就相当于浪费了。
4.2 格雷码(Gray Code)
相邻数值仅有一位不同,用于减少传感器或通信中的错误。
转换规则:二进制码 → 格雷码:保留最高位,其余每位与前一位异或。
4.3 ASCII码
用7位二进制表示128个字符(包括字母、数字和控制符),扩展ASCII码使用8位。这里的数字就不是运算的数值了,比如数字 1 ,实际上是字符 1
,背后则是00110001
。
需要记住一些常用的 ASCII 码,比如:
字符 | 十六进制 | 十进制 | 字符 | 十六进制 | 十进制 |
---|---|---|---|---|---|
0 | 30H | 48 | 回车 | 0DH | 13 |
A | 41H | 65 | 空格 | 20H | 32 |
a | 61H | 97 | 退格 | 08H | 8 |
因为背后的二进制码太过冗长,且难以记忆,因此我们通常转换为十六进制或者十进制进行记忆。
5. 二进制数的运算
5.1 算术运算
- 加法:逢2进1(如 1011 + 0110 = 10001 1011 + 0110 = 10001 1011+0110=10001)。
- 减法:借1当2(需处理补码,见第7节)。
- 乘法:移位相加(如 101 × 11 = 1111 101 × 11 = 1111 101×11=1111)。
- 除法:类似十进制的长除法。
5.2 逻辑运算
- 与(AND):全1则1,否则0。
- 或(OR):有1则1。
- 非(NOT):取反。
- 异或(XOR):相同为0,不同为1。
6. 数的定点与浮点表示
6.1 定点数
- 整数:小数点固定在最低位右侧(如16位整数范围为 − 32768 -32768 −32768到 32767 32767 32767)。
- 小数:小数点固定在最高位右侧(如8位定点小数可表示范围 0.00390625 0.00390625 0.00390625到 0.99609375 0.99609375 0.99609375)。
6.2 浮点数(IEEE 754标准)
用科学计数法表示数: N = ( − 1 ) S × M × 2 E N = (-1)^S × M × 2^E N=(−1)S×M×2E
- 单精度(32位):1位符号位(S),8位阶码(E),23位尾数(M)。
- 双精度(64位):1位符号位,11位阶码,52位尾数。
规格化处理:调整阶码使尾数最高位为1(背后隐含存储)。
7. 带符号数的表示法
7.1 原码、反码、补码
- 原码:最高位为符号位(0正1负),数值部分直接转换(如 − 5 10 = 10101 -5_{10} = 1 0101 −510=10101)。
- 反码:正数同原码,负数符号位不变,数值位取反( − 5 10 = 11010 -5_{10} = 1 1010 −510=11010)。
- 补码:正数同原码,负数为反码+1(
−
5
10
=
11011
-5_{10} = 1 1011
−510=11011)。
除了补码可以表示范围是:+127D~128D
,原码和反码的范围只能是+127D~-127D
7.2 补码的优势
- 统一加减法:减法可转换为加法(如 A − B = A + ( − B ) 补 A - B = A + (-B)_{补} A−B=A+(−B)补)。
- 消除+0和-0歧义:补码中0的唯一表示为全0。
7.3 溢出检测
溢出,是对于带符号数的运算结果而言。
只有在当两个正数相加结果为负,或两个负数相加结果为正时,才会发生溢出。
这里总结的判断方法有两个:
一是看两个数符号是否一致,不一致一定不会溢出,一致则判断运算结果是否正确,运算错误一定溢出。
二是双进位法,即通过符号位,数值最高位,这两个位置的进位状态取异或的结果,如果结果是1,则溢出。
8. 总结
主要掌握进制之间的转换,因为这部分也是模电要求的内容,涉及到底层会比较重要,其次则是一些常用的ASCII码的记忆,这些可能在编程的时候会用到,最后需要分清补码,原码,反码这些概念,还有溢出的判断方法。