写在前面:
- 本系列笔记主要以《计算机组成原理(唐朔飞)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。
-
视频链接:计算机组成原理(哈工大刘宏伟)135讲(全)高清_哔哩哔哩_bilibili
一、无符号数
计算机中的数均放在寄存器中,通常称寄存器的位数为机器字长。
所谓无符号数,即没有符号的数,在寄存器中的每一位均可用来存放数值。(通常只有无符号整数,没有无符号小数的说法)
在机器字长相同时,无符号数与有符号数所对应的数值范围是不同的,因为有符号数需要预留一个位作为符号位。以机器字长为16位为例,无符号数的表示范围为0~65535(),有符号数的表示范围为-32768~32767(
)。
二、有符号数
1、机器数与真值
(1)对有符号数而言,符号的“正”、“负”机器是无法识别的,但由于“正”、“负”恰好是两种截然不同的状态,如果用“0”表示“正”、用“1”表示“负”,这样符号也被数字化了,并且规定将它放在有效数字的前面,即组成了有符号数。
(2)有符号小数(二进制形式)在机器中的表示:
(3)有符号整数(二进制形式)在机器中的表示:
2、原码表示法
(1)原码是机器数中最简单的一种表示形式,符号位为0表示正数,符号位为1表示负数,数值位即真值的绝对值,故原码表示又称为带符号的绝对值表示。上面列举的4个真值所对应的机器数即为原码。为了书写方便以及区别整数和小数,约定整数的符号位与数值位之间用逗号隔开,小数的符号位与数值位之间用小数点隔开。
(2)整数原码的定义(x为真值,n为整数的位数):
(3)小数原码的定义(x为真值):
(4)需要注意的是,原码中的“零”有两种表现形式,即“正0”和“负0”,它们的二进制形式是不一样的,区别就在符号位上。
3、补码表示法
(1)原码表示简单明了,并易于和真值转换,但用原码进行加减运算时却带来了许多麻烦,例如当两个操作数符号不同且要做加法运算时,需要先要判断两数绝对值大小,然后将绝对值大的数减去绝对值小的数,结果的符号以绝对值大的数为准,运算步骤既复杂又费时,而且本来是加法运算却要用减法器实现,如果能找到一个与负数等价的正数来代替该负数,就可把减法操作用加法代替,而机器数采用补码时,就能满足此要求。
(2)整数补码的定义(x为真值,n为整数的位数):
(3)小数补码的定义(x为真值):
(4)需要说明的是,补码中的“零”只有一种表示形式。
(5)求补码的快捷方式:当真值为负时,补码可用原码除符号位外的每位取反,然后末位加1求得;当真值为正时,补码即原码。
4、反码表示法
(1)反码通常用来作为由原码求补码或者由补码求原码的中间过渡,当真值为负时反码可用原码除符号位外的每位取反求得,当真值为正时反码即原码。
(2)整数反码的定义(x为真值,n为整数的位数):
(3)小数反码的定义(x为真值):
5、移码表示法
(1)当真值用补码表示时,由于符号位和数值部分一起编码,与习惯上的表示法不同,因此人们很难从补码的形式上直接判断其真值的大小,为此又出现了移码。
(2)移码的定义:
(3)其实移码就是在真值上加一个常数,在数轴上移码所表示的范围恰好对应于真值在数轴上的范围向轴的正方向移动
个单元。
①最小真值的移码全为“0”。
②当浮点数的阶码用移码表示时,可以很方便地判断阶码的大小。
③同一个真值的移码和补码仅差一个符号位,若将补码的符号位由“0”改为“1”,或从“1”改为“0”,即可得到该真值的移码。
6、有符号数的扩展
(1)一个有符号数可以用较少的二进制位表示(前提是在表示范围内,例如8位二进制数不能表示65535,可以表示64),也可以用较多的二进制位表示,增加有符号数的表示位数(比如原本用8位二进制代码表示,现在用16位二进制代码表示),这个过程称为有符号数的扩展。
(2)定点整数的符号扩展:在原符号位和数值位的中间添加新位,真值为正的话无论原码、补码或反码都添“0”,真值为负的话,原码添“0”,反码和补码都添“1”。
(3)定点小数的符号扩展:原符号位和数值位后面添加新位,真值为正的话无论原码、补码或反码都添“0”,真值为负的话,原码添“0”,反码和补码都添“1”。
负整数 | 负整数扩展结果 | 负小数 | 负小数扩展结果 | |
原码 | 1,1011010 | 1,0000000 01011010 | 1.1011010 | 1.1011010 00000000 |
反码 | 1,0100101 | 1,1111111 10100101 | 1.1011011 | 1.1011011 11111111 |
补码 | 1,0100110 | 1,1111111 10100110 | 1.1011110 | 1.1011110 00000000 |