Skip to content

数制(计数制)

多位数码的构成方式及从低位到高位的进位规则称为进位计数制,即进制,如十进制、二进制、八进制、十六进制等

  1. 数码(数元):数制中用来表示数据的数字符号

  2. 基数(基):数制所使用的数码个数,常用"R"表示,称为R进制。一般在右下标明或后加大写字母符号,十进制可省略

  3. 位权:数码在第i位上的权值,整数部分为\(R^{(i-1)}\), 小数部分为\(R^{-i}\)

image.png

image.png

image.png

image.png

数制 符号 基数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}\)

image.png

  1. 计算机内部所有数据、文件或指令的传送、储存、处理都是通过二进制码进行的 (1)物理上容易实现; (2)运算简单; (3)可靠性高; (4)易于实现逻辑运算。
  2. 在计算机程序编写中,为了书写方便,会采用十六进制

进制转换

可参考进制转换工具及文章网站:在线进制转换 | 进制转换器 — 在线工具 (sojson.com) 可自行练习,通过此工具验证自己的计算结果

十进制转R进制

整数部分:除R倒序取余,直至商为0

小数部分:乘R顺序取整,直至小数部分为0或满足精度(可能较长,根据精度取舍)

结果 = 整数部分 + 小数部分

image.png

image.png

R进制转十进制

每一位进制数乘以位权后相加(按权展开、相加)

image.png

二进制转八、十六进制

整数部分从右往左,小数部分从左往右,转八进制以3位二进制数为一组(取三合一),转十六进制以4位二进制数为一组(取四合一);不足时,整数部分最高位补0,小数部分最低位补0(保证补0后位权不变)。将每组二进制数转化为十进制,每组十进制数组合在一起即为对应进制数

image.png

image.png

八、十六进制转二进制

将每位进制数以十进制转二进制,八进制每位数转为3位二进制数(取一分三),十六进制每位数转为4位二进制数(取一分四),不足左边补0(保证补0后各位权不变),组合在一起即为对应二进制数

image.png

八进制与十六进制互转

  1. 八进制/十六进制 → 十进制 → 十六进制/八进制

  2. 八进制/十六进制 → 二进制 → 十六进制/八进制

进制运算

算术运算

逢R进1,借1当R(参考十进制)

  1. 加法

image.png

image.png

image.png

  1. 减法

image.png

image.png

image.png

  1. 乘法

image.png

image.png

image.png

  1. 除法

image.png

image.png

image.png

逻辑运算

  1. 逻辑与、逻辑乘(&,and,^):有0即为0,否则为1

image.png

  1. 逻辑或、逻辑加(|,or,v):有1即为1,否则为0

image.png

  1. 逻辑非、取反(!,not):#1 = 0, !0= 1

image.png

  1. 逻辑异或(^,xor):同0异1

image.png

  1. 逻辑同或(xnor):同1异0,编程语言无该运算,通过异或实现

image.png

image.png

数据单位

  1. 二进位、位、比特(b,bit):一个二进制位,只有两个取值0和1,无大小之分 存储数据的最小单位、组成数字信息的最小单位 如 1011 为4 位或4 bit、4 b

  2. 位模式(位流):多个位组成一个位模式 如 1011 为长度为4的位模式

  3. 字节(B,Byte):长度为8的位模式 存储信息的基本单位、数据处理的最小单位 如 10111010 为1字节或1 B 1 B = 8 bit

  4. 字:是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,原码=补码,与事实相符。

Screenshot_20230812_183557_tv.danmaku.bili_edit_35677075999764.jpg

所以,目前**计算机内部都是以补码的形式存储和处理数据,但最终结果是以原码形式呈现**,即运算通过补码进行,得到的结果也是补码,但最终输出需要将补码转换为原码才是我们所能理解的计算结果。

| 二进制 | 无符号数| 带符号数|||| |-|-|-|-|-|-| |||作为原码|作为反码|作为补码|作为移码| |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代表的是数值部分的位数,不是字长)

image.png

真值:带符号的数,一般书写表示的数

机器数(机器码):符号数字化的数,计算机内部编码的数,通过原码、反码、补码、移码等表示。最高位为符号位,1表示负数,0表示正数,其余n-1个存储位用来存储数据,整数高位补0,小数低位补0,共可表示\(2\times2^{n-1} = 2^{n}\)个有符号整数

如: +10 → 真值\(x\):+1010 → 原码\([x]_{原}\):0000 1010 - 10 → 真值\(x\):- 1010 → 原码\([x]_{原}\):1000 1010

  1. 原码 代表的范围为 ****\(-(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}\)

  1. 反码 代表的范围为 \(-(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
  1. 正数:反码 = 原码

  2. 负数:符号位不变,非符号位取反 (= 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}\)

  1. 补码 代表的范围为**\(-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. 正数:补码 = 原码

  2. 负数:补码 = 反码末位 + 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. 一个正数和一个负数互为补数时,他们的绝对值之和即为模

  1. 移码 代表的范围为**\(-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}\)

image.png

已知任意数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

image.png

  1. 原码:\(-(1-2^{1-n})\) ≤ x ≤ \(1-2^{1-n}\)

  2. 反码:\(-(1-2^{1-n})\) ≤ x ≤ \(1-2^{1-n}\)

  3. 补码:-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为尾数

image.png

假设一个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

  2. 右规 尾数算数右移或者小数点左移,每移1位,阶码+1

IEEE 754标准

image.png

image.png

该标准中,阶码用移码表示,在移码的定义中:移码 = 真值 + 偏置值

如-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

Comments