数制(计数制)¶
多位数码的构成方式及从低位到高位的进位规则称为进位计数制,即进制,如十进制、二进制、八进制、十六进制等
-
数码(数元):数制中用来表示数据的数字符号
-
基数(基):数制所使用的数码个数,常用"R"表示,称为R进制。一般在右下标明或后加大写字母符号,十进制可省略。
-
位权:数码在第i位上的权值,整数部分为\(R^{(i-1)}\), 小数部分为\(R^{-i}\)
| 数制 | 符号 | 基数R | 数码 | 位权 |
|---|---|---|---|---|
| 十进制 | D (Decimal) | 10 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 | \(10^{(i-1)}\) 或 \(10^{-i}\) |
| 二进制 | B (Binary) | 2 | 0, 1 | \(2^{(i-1)}\) 或 \(2^{-i}\) |
| 八进制 | O (Octonary)或Q | 8 | 0, 1, 2, 3, 4, 5, 6, 7 | \(8^{(i-1)}\) 或 \(8^{-i}\) |
| 十六进制 | H (Hexadecimal) | 16 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F | \(16^{(i-1)}\) 或 \(16^{-i}\) |
- 计算机内部所有数据、文件或指令的传送、储存、处理都是通过二进制码进行的 (1)物理上容易实现; (2)运算简单; (3)可靠性高; (4)易于实现逻辑运算。
- 在计算机程序编写中,为了书写方便,会采用十六进制
进制转换¶
可参考进制转换工具及文章网站:在线进制转换 | 进制转换器 — 在线工具 (sojson.com) 可自行练习,通过此工具验证自己的计算结果
十进制转R进制¶
整数部分:除R倒序取余,直至商为0
小数部分:乘R顺序取整,直至小数部分为0或满足精度(可能较长,根据精度取舍)
结果 = 整数部分 + 小数部分
R进制转十进制¶
每一位进制数乘以位权后相加(按权展开、相加)
二进制转八、十六进制¶
整数部分从右往左,小数部分从左往右,转八进制以3位二进制数为一组(取三合一),转十六进制以4位二进制数为一组(取四合一);不足时,整数部分最高位补0,小数部分最低位补0(保证补0后位权不变)。将每组二进制数转化为十进制,每组十进制数组合在一起即为对应进制数
八、十六进制转二进制¶
将每位进制数以十进制转二进制,八进制每位数转为3位二进制数(取一分三),十六进制每位数转为4位二进制数(取一分四),不足左边补0(保证补0后各位权不变),组合在一起即为对应二进制数
八进制与十六进制互转¶
-
八进制/十六进制 → 十进制 → 十六进制/八进制
-
八进制/十六进制 → 二进制 → 十六进制/八进制
进制运算¶
算术运算¶
逢R进1,借1当R(参考十进制)
- 加法
- 减法
- 乘法
- 除法
逻辑运算¶
- 逻辑与、逻辑乘(&,and,^):有0即为0,否则为1
- 逻辑或、逻辑加(|,or,v):有1即为1,否则为0
- 逻辑非、取反(!,not):#1 = 0, !0= 1
- 逻辑异或(^,xor):同0异1
- 逻辑同或(xnor):同1异0,编程语言无该运算,通过异或实现
数据单位¶
-
二进位、位、比特(b,bit):一个二进制位,只有两个取值0和1,无大小之分 存储数据的最小单位、组成数字信息的最小单位 如 1011 为4 位或4 bit、4 b
-
位模式(位流):多个位组成一个位模式 如 1011 为长度为4的位模式
-
字节(B,Byte):长度为8的位模式 存储信息的基本单位、数据处理的最小单位 如 10111010 为1字节或1 B 1 B = 8 bit
-
字:是CPU一次处理的数据,通常由**一个字节或若干个字节**组成 字长:计算机一次能处理的实际位数长度,衡量计算性能 如 计算机的32位和64位处理器,64位处理器一次提取8个字节的数据,而32位则一次提取4个字节的数据
| 进制 | 应用 | 单位换算 |
|---|---|---|
| 二进制 | 内存、外存(操作系统显示)、cache、半导体存储器芯片、文件和文件夹大小 | 1 KB(千字节) = \(2^{10}\) B = 1024 B |
| 1 MB(兆字节、兆) = \(2^{20}\) B = 1024 KB | ||
| 1 GB(吉字节、千兆) = \(2^{30}\) B = 1024 MB | ||
| 1 TB(太字节) = \(2^{40}\) B = 1024 GB | ||
| PB(拍字节)、EB(艾字节)、ZB(泽字节)、YB(尧字节)、BB | ||
| 十进制 | 外存(厂商标注) | 1 KB(千字节) = \(10^{3}\) B = 1000 B |
| 1 MB(兆字节、兆) = \(10^{6}\) B = 1000 KB | ||
| 1 GB(吉字节、千兆) = \(10^{9}\) B = 1000 MB | ||
| 1 TB(太字节) = \(10^{12}\) B = 1000 GB | ||
| PB(拍字节)、EB(艾字节)、ZB(泽字节)、YB(尧字节)、BB | ||
| 频率(Hz) | 1 KHz = $10^{3} $ Hz = 1000 Hz | |
| 1 MHz = \(10^{6}\) Hz = 1000 KHz | ||
| 1 GHz = \(10^{9}\) Hz = 1000 MHz | ||
| 传输速率(b/s、bps) | 1 Kb/s = \(10^{3}\) b/s = 1000 b/s | |
| 1 Mb/s = \(10^{6}\) b/s = 1000 Kb/s | ||
| 1 Gb/s = \(10^{9}\) b/s = 1000 Mb/s | ||
| 1 Tb/s = \(10^{12}\) b/s = 1000 Gb/s |
整数表示法¶
假设一个字长为8的计算机,即只能处理8位二进制数的运算。已知**计算机只有加法器,没有减法器,减法只能通过加法实现**,即5 - 5 = 0,计算机只能通过5 +(-5)= 0实现。
5的二进制表示为\(101_{(2)}\),若直接将其存入计算机中,则为0000 0101,此即无符号整数原码。为了存储负数,首先提出了将**最高位作为符号位,以符号位为0代表正数,符号位为1代表负数**。因此,5的内部表示仍为0000 0101,而-5的内部表示则为1000 0101,此即带符号整数原码。此时若作运算:5 + (-5) = 0000 0101 + 1000 0101 = 1000 1010 = -10,与已知事实不符。
后继提出了**反码,即原码符号位保持不变,非符号位取反**,但**正数的反码等于原码**。则5的反码仍为0000 0101,-5的反码为1111 1010。此时若作运算:5 + (-5) = 0000 0101 + 1111 1010 = 1111 1111,将结果再次转为原码: 1000 0000,即最终运算结果为-0,为非常规数。
正是由于原码和反码用于运算存在错误,而且原码中0000 0000表示+0, 1000 0000表示-0,反码中0000 0000表示+0和 1111 1111表示-0,与常识不符,因此不适合使用原码和反码来存储和处理数据。
最后提出了**补码,即反码+1**,但**正数的补码也等于原码**。则5的补码仍为0000 0101,而-5的补码为1111 1011。此时若做运算:5 + (-5) = 0000 0101 + 1111 1011 = 1 0000 0000,由于只能处理8位,所以最高位1溢出被忽略,结果为0000 0000,原码=补码,与事实相符。
所以,目前**计算机内部都是以补码的形式存储和处理数据,但最终结果是以原码形式呈现**,即运算通过补码进行,得到的结果也是补码,但最终输出需要将补码转换为原码才是我们所能理解的计算结果。
| 二进制 | 无符号数| 带符号数|||| |-|-|-|-|-|-| |||作为原码|作为反码|作为补码|作为移码| |0000 0000|0|+0|+0|0|-128| |0000 0001|1|1|1|1|-127| |......|......|......|......|......|......| |0111 1111|127|127|127|127|-1| |1000 0000|128|-0|-127|-128|0| |1000 0001|129|-1|-126|-127|1| |......|......|......|......|......|......| |1111 1110|254|-126|-1|-2|126| |1111 1111|255|-127|-0|-1|127|
无符号整数¶
无符号位,每一位都用来存储数据,空位补0,一共可表示\(2^{n}\)个无符号整数,范围为**0 ~ \(2^{n}-1\)**,若该无符号整数超过了该范围,高位将会发生溢出,仅保留低位的n位
8位无符号整数的范围为 0000 0000 ~ 1111 1111,代表0 ~255,若用来表示256(1 0000 0000),则最高位溢出无法处理,只保留0000 0000,最终表示0(类似于0~255的钟表,过了255重新循环)
带符号整数(定点整数)¶
小数点位置默认固定隐含在最低位右侧,实际并不储存,用于表示**纯整数**
(注:下图中n代表的是数值部分的位数,不是字长)
真值:带符号的数,一般书写表示的数
机器数(机器码):符号数字化的数,计算机内部编码的数,通过原码、反码、补码、移码等表示。最高位为符号位,1表示负数,0表示正数,其余n-1个存储位用来存储数据,整数高位补0,小数低位补0,共可表示\(2\times2^{n-1} = 2^{n}\)个有符号整数
如: +10 → 真值\(x\):+1010 → 原码\([x]_{原}\):0000 1010 - 10 → 真值\(x\):- 1010 → 原码\([x]_{原}\):1000 1010
- 原码 代表的范围为 ****\(-(2^{n-1} -1)\) ~ \(\pm0\) ~ \((2^{n-1} - 1)\),8位有符号整数原码范围为 11111111 ~ 100000000 ~ 00000000 ~ 01111111(-127 ~ ±0 ~ +127) +10 → \(x\):+1010 → \([x]_{原}\) = \(x\) = 0000 1010
- 10 → \(x\):- 1010 → \([x]_{原}\) = \(2^{7} + \mid -1010 \mid\) = 1000 0000 + 1010 = 1000 1010
\([x]_{原} = \begin{cases}x & 2^{n-1}>x\geq 0\\2^{n-1}-x = 2^{n-1}+\mid x \mid & 0 \geq x > -2^{n-1}\end{cases}\)
- 反码 代表的范围为 \(-(2^{n-1} -1)\) ~ \(\pm0\) ~ \((2^{n-1} - 1)\),8位有符号整数反码范围为1000 0000 ~ 1111 1111 ~ 0000 0000 ~ 0111 1111(-127 ~ ±0 ~+127) +10 → \([x]_{原}\) = 0000 1010 → \([x]_{反} = [x]_{原}\) = 0000 1010
- 10 → \([x]_{原}\) = 1000 1010 → \([x]_{反} =\) 1111 0101
- 10 → \(x\) = -1010 → \([x]_{反}\) = \((2^{8}-1)\) - 1010 = 1111 1111 - 1010 = 1111 0101
-
正数:反码 = 原码
-
负数:符号位不变,非符号位取反 (= 1111 1111 + \(x\))
\([x]_{补} = \begin{cases}x & 2^{n-1}>x\geq 0\\(2^{n}-1)+x = (2^{n}-1)- \mid x \mid & 0 \geq x > -2^{n-1}\end{cases}\)
- 补码 代表的范围为**\(-2^{n-1}\sim(2^{n-1}-1)\),8位有符号整数补码范围为1000 0000 ~ 1111 1111 ~ 0000 0000 ~ 0111 1111(-128 ~ -1 ~ 0 ~ 127)。补码的优点是能多表示一个负数\(-2^{n-1}\),且仅保留一个0。**补码与原码互补 +10 → \([x]_{原}\) = 0000 1010 → \([x]_{补} = [x]_{原}\) = 0000 1010
- 10 → \([x]_{反}\) = 1111 0101 → \([x]_{补} = [x]_{反}\)末位 + 1 = 1111 0101 + 1 = 1111 0110
- 10 → \(x\) = -1010 → \([x]_{补}\) = \(2^{8}\) - 1010 = 1 0000 0000 - 1010 = 1111 0110
-
正数:补码 = 原码
-
负数:补码 = 反码末位 + 1 (= 1 0000 0000 + \(x\))
\([x]_{补} = \begin{cases}x & 2^{n-1}>x\geq 0\\2^{n}+x = 2^{n}- \mid x \mid & 0 > x \geq -2^{n-1}\end{cases}\)
补码的概念类似于生活中的时钟(12h制)。例如现在为6时,若想到3时,可以有6-3=3时,也可以是6+9=3时,此时可以说+9是-3以12为模的补数,即可实现以加法代替减法 模是指一个计量系统的计数范围,时钟的计量范围是1~12,模=12。表示n位的计算机计量范围是**0 ~ \(2^{n}-1\)**,模=\(2^{n}\) 1. 一个负数加上模即得该负数的补数 2. 一个正数和一个负数互为补数时,他们的绝对值之和即为模
- 移码 代表的范围为**\(-2^{n-1}\sim(2^{n-1}-1)\),8位有符号整数移码范围为0000 0000 ~1111 1111(-128 ~ 127)。优点是能够直接判断真值大小。一般用于表示浮点数的阶码。 **移码 = 补码符号位取反
\([x]_{移} = 2^{n-1} + x, 2^{n-1}>x\geq-2^{n-1}\)
已知任意数Y求其8位原码:绝对值转二进制,高位补0足8位,确定符号位 +10的原码:绝对值转二进制 → 1010,高位补0足8位 → 0000 1010,正数最高位为0 → 0000 1010 - 10的原码:绝对值转二进制 → 1010,高位补0足8位 → 0000 1010,负数最高位为1 → 1000 1010
**已知负数(-X)求其8位补码:反码末位 + 1 -10的补码:原码 → 1000 1010,反码 → 11110101,+1 → 1111 0110
已知负数(-X)求其8位补码:\(2^{n} + x\) -10的补码:\(x\):-1010 → 计算\(2^{8}\) - 1010 = 1 0000 0000 - 1010 = 1111 0110 -128的补码:\(x\):-1000 0000 → 计算\(2^{8}\) - 1000 0000 = 1 0000 0000 - 1000 0000 = 1000 0000**
**已知8位补码求负数(-X):补码的补码,即符号位不变取反末位+1得原码,二进制转十进制(符号位不算) 1111 0110 → 1000 1001 → 1000 1010 → -10
已知8位补码求负数(-X):逆运算,即末位-1符号位不变取反得原码,二进制转十进制(符号位不算) 1111 0110 → 1111 0101 → 1000 1010 → -10
已知8位补码求负数(-X):\([x]_{补}\) - \(2^{n}\) 1111 0110 → 246 → 246 - \(2^{8}\) → -10 1000 0000 → \(2^{7}\) → \(2^{7}\) - \(2^{8}\) = -128**
定点小数表示法¶
小数点默认固定隐含在符号位右侧,实际并不储存,用于表示**纯小数**,如0.75、0.1222、0.5等
定点小数的表示方法有原码、反码、补码,转换方式同定点整数(公式中n=1),仅二进制位权不同,低位补0
-
原码:\(-(1-2^{1-n})\) ≤ x ≤ \(1-2^{1-n}\)
-
反码:\(-(1-2^{1-n})\) ≤ x ≤ \(1-2^{1-n}\)
-
补码:-1 ≤ x ≤ \(1-2^{1-n}\)
| 二进制 | 作为原码 | 作为反码 | 作为补码 |
|---|---|---|---|
| 0.000 0000 | +0 | +0 | 0 |
| 0.000 0001 | \(2^{-7}\) | \(2^{-7}\) | \(2^{-7}\) |
| ...... | ...... | ...... | ...... |
| 0.111 1111 | 1-\(2^{-7}\) | 1-\(2^{-7}\) | 1-\(2^{-7}\) |
| 1.000 0000 | -0 | -(1-\(2^{-7}\)) | -1 |
| 1.000 0001 | \(-2^{-7}\) | -(1-\(2^{-6}\)) | -(1-\(2^{-7}\)) |
| ...... | ...... | ...... | ...... |
| 1.111 1110 | -(1-\(2^{-6}\)) | -\(2^{-7}\) | -\(2^{-6}\) |
| 1.111 1111 | -(1-\(2^{-7}\)) | -0 | \(-2^{-7}\) |
+0.75 真值:+0.11 原码:0.110 0000 反码:0.110 0000 补码:0.110 0000
- 0.75 真值:-0.11 原码:1.110 0000 反码:1.001 1111 = 1.111 1111 -0.11 补码:1.010 0000 = 1 0.000 0000 - 0.11
浮点数表示法¶
浮点数即实数,是指机器数表示中小数点位置不固定的数,能够在位数不变的情况下增加数据表示范围,包括整数部分和小数部分,但在计算机中存储只存储数值和小数点在数值中的位置。
科学计数法¶
\(N = M \times r^{E}\)
r:\(R^{i}\)(i≥1,一般为1),无需存储
E:阶码,反映数值范围大小及小数点的实际位置。计算机中常为补码或移码表示的定点整数(纯整数)
M:尾数,数值部分位数反映精度。位数越多,精度越高。计算机中常为原码或补码表示的定点小数(纯小数)
十进制:+302657264526 = \(+3.026 \times 10^{11}\),+11为阶码,+3.026为尾数
二进制:+0.375 = + 0.011B =$ + 0.00011 \times 2^{2}B$ =$ +0.00011 \times 2^{10}B$,+10为阶码,+0.00011为尾数
+0.375 = + 0.011B = $+0.11\times2^{-01}B$ ,-01为阶码,+0.11为尾数
假设一个8字长的计算机,阶码共3位,阶符1位,尾数共5位,数符1位,将+0.375进行存储,均以补码形式,以上述第一种为例 阶码 真值:+10 → 原码:010 → 补码:010 尾数 真值:+0.00011 → 原码:0.0001(低位1丢弃) → 补码:0.0001
结果:01000001 结果 → 浮点数:\(+0.0001 \times 2^{10}\) = +0.01 = +0.25
可见结果丧失了精度,因此浮点数存储时尾数还需要规格化
尾数规格化¶
当尾数数值部分的最高位为无效值0时,结果会丧失精度。因此,规格化浮点数即尾数最高数值位必须为一个有效值1,即\(±0.1xxxx \times r^{E}\)
上述+0.375的第二种表示即为规格化表示,相对于第一种,数值部分向左移了3位,阶码减3,这叫左规。
-
左规 尾数算数左移或者小数点右移,每移1位,阶码-1
-
右规 尾数算数右移或者小数点左移,每移1位,阶码+1
IEEE 754标准¶
该标准中,阶码用移码表示,在移码的定义中:移码 = 真值 + 偏置值
如-46.375 = -101110.011 B = \(-1.01110011 \times 2^{5} B\) = \(-1.01110011 \times 2^{101} B\),转换为单精度浮点数表示: 数符:1(负数) 尾数M :
1.01110011000000000000000 B 阶码E :101 B + 01111111 B = 1000 0100 B 结果:11000010001110011000000000000000 B
如单精度浮点数C0A00000 H,表示的浮点数:
二进制:11000000101000000000000000000000 B
数符:1(负数)
尾数M:1.01000000000000000000000 B
阶码:10000001 B - 01111111 B = 10 B
结果:\(-1.01 \times 2^{10} B\) = \(-1.01 \times 2^{2} B\) = -101 B = -5.0



































