# 进位计数制

基数 R：允许使用的基本数码个数

 权 Wi：权也称位权，第 i 位上的数码的权重

值，即权与数码所处的位置 i 有关

$W_i=R$ **假设任意数值N用R进制数来表示：**$N= (D{m-1}D{m-2}...D_0 . D_{-1}D{-2}...D{-k}）_R$Di：基本符号，$D_i \in [0, R-1], \quad i = -k, -k+1, \ldots, m-1$;小数点在$D_0$和$D_{-1}$之间

数值N的实际值为：加权求和

 十进制:$N=\Sigma_{i=-k}^{m-1}(D_i \times R^i)$

何谓十进制、二进制、八进制、十六进制？

<table><tr><td>进制</td><td>基数R</td><td>权Wi</td><td>数码符号</td></tr><tr><td>十进制</td><td>R=10</td><td>10^i</td><td>0~9</td></tr><tr><td>二进制</td><td>R=2</td><td>2^i</td><td>0、1</td></tr><tr><td>八进制</td><td>R=8</td><td>8^i</td><td>0~7</td></tr><tr><td>十六进制</td><td>R=16</td><td>16^i</td><td>0~9、A~F</td></tr></table>

二进制$\rightarrow$八进制

 以小数点为中心分别向两边分组，每三位一组，写出对应的八进制数字（不够位数则在两边加0补足3位 ）
 二进制$\rightarrow$ 十六进制
 以小数点为中心分别向两边分组，每四位一组，写出对应的十六进制符号（不够位数则在两边加0补足4位 ）
 八进制$\rightarrow$ 二进制
 将每位八进制数展开为3位二进制数，整数的最高位0和小数的最低位0可以略去
 十六进制 $\rightarrow$二进制
 将每位十六进制数展开为4位二进制数，整数的最高位0和小数的最低位0可以略去

如何在计算机内使用二进制来表示十进制数据？

十进制数的编码

BCD（Binary Coded Decimal）码：
 使用二进制来编码十进制数字 0~9编码方法：
 一般使用 4 位二进制编码来表示 1 位十进制数字
 在 16 个编码中选用 10 个来表示数字0~9
 不同的选择构成不同的 BCD 码
分类：
 有权码：编码的每一位都有固定的权值，加权求和的值即是表示的十进制数字。如 8421 码、2421 码、5211 码、4311 码、84 -2-1 码等
 无权码：编码的每一位并没有固定的权，主要包括格雷码、余 3 码等

十进制数串的表示方法

数值数据：用于表示数的大小，其值确定，可与数轴上确切的点对应

 非数值数据：没有值大小的概念，表示字符、汉字、图像、声音等信息
 计算机中如何表示数值数据？数值数据的格式要素，必须要考虑三点

 第一，符号如何表示？
 第二，小数点如何表示？
 第三，二进制数字如何排列来表示某个数值？
 机器数：数值数据在计算机中的二进制表示形式。
 机器数的符号位必须被数值化为二进制 0 和 1
 机器数的小数点用隐含规定的方式来表达
 表示的数值范围受计算机字长的限制
 编码方法：不同的排列方式，常见的有原码、反码、补码、移码。
 真值：机器数真正表示的数值数据
 书写： $+ /$ －符号 数值（二进制或十进制）

计算机中参与运算的数值数据有两种：

 无符号数据（Unsigned ）：所有的二进制数据位数均用来表示数值本身，没有正负之分

 带符号数据（Signed）：则其二进制数据位，包括符号位和数值位
 当机器字长相同时，无符号数和有符号数的表示范围是不同的
计算机中：小数点的表示方法？
 计算机中没有专用的部件用来表示小数点
 机器数中，小数点及其位置是隐含规定的
 有两种隐含方式：定点和浮点

定点机器数（Fixed Point）：小数点的位置是固定不变的，两种位置：

 定点小数：纯小数，隐含固定在符号位Xs（最高位）之后，整数位是符号位
 定点整数：纯整数，小数点隐含固定在最低位之后，最高位为符号位Xs

| 符号位 | 小数点隐含位置 | 数值位    |
| ------ | -------------- | --------- |
| X_s    | .              | X1X2...Xn |

| 符号位 | 数值位    | 小数点隐含位置 |
| ------ | --------- | -------------- |
| Xs     | X1X2...Xn | .              |

浮点机器数：将实数数值大小表示成科学计数法形式

 浮点数 N 由三部分构成：
 阶码的底 R：隐含表示，一般约定为 2、8 或 16
 尾数M：系数，为定点小数
 阶码 E：R 的指数，为定点整数
 对尾数所表示的定点小数，进行按比例放大（阶码为正数）或者按比例缩小（阶码为负数），数据真值的小数点位置是浮动的——位置由阶码规定

| 阶码(指数，定点整数) | 尾数（系数，定点小数） |
| -------------------- | ---------------------- |
| EsE1E2...Em .        | MS  .  M1M2...Mn       |

 负精度-δ：机器数在数轴上最靠近原点0的负数，计算机能表示的最大负数
 正精度δ：机器数在数轴上最靠近原点0的正数，计算机能表示的最小正数绝对值称为精度δ或分辨率，代表了机器数所能表示的绝对值最小的非零值
 机器数的表示范围：[最小数，最大负数]、0、[最小正数，最大数]
 最大数和和最小数：取决于机器数的编码方式、位数和格式

![image-20260901223444503](https://nas.chenalna.site/sata11-19012711369/images/image-20260901223444503.png)

下溢：位于最大负数和最小正数之间的数据（除 0 外），机器无法表示。

 处理：计算机直接将其视为机器零。

 上溢：当一个数据大于最大（正）数，或者小于最小（负）数时，机器也无法表示，称为上溢，上溢又称溢出。
 处理：计算机置溢出标志位，或者报警。

原码表示法

数学定义：真值（X）与编码（[X]原）（加权求和对应的二进制数（无符号数））之间的数学关系

[+1101]原=0 1101

X=+1101(+13)

[X]原=0 1101 13

[-1101]原=1 1101

Y=-1101 （-13）

[Y]原=1 1101 29

定点整数

$$
\left[ X \right] _{\text{原}}=\begin{cases}
	X,&		X\,\,\ge 0\\
	2^n-X&		X\,\,\le 0\\
\end{cases}
\\ 
$$

定点小数

$$
\left[ X \right] _{\text{原}}=\begin{cases}
	X,&		X\,\,\ge 0\\
	1-X&		X\,\,\le 0\\
\end{cases}
$$
表示范围：对于n+1位原码机器数X(包括1位符号位，n位数值位)，所能表示的数据范围位：

定点整数：$-(2^n-1)\le X \le 2^n-1$

定点小数：$-(1-2^{-n}) \le X \le 1-2^{-n}$

 使用原码进行加减乘除运算：规则类似于真值的加减乘除运算
 符号位单独处理，不能参加运算，参加运算的是绝对值
 加减运算：
• 根据符号位决定进行的是绝对值的加还是减
• 进行绝对值的加减运算
• 根据绝对值的大小决定结果（和或者差）的符号

表示方法：最高位为符号位，其他位为数值位

 符号位：0－正数，1－负数
 数值位：与绝对值相同

“，”和”。”只用于助记，在计算机中并无专用部件来表示

对于定点整数：

 若 $X=+X_1X_2...Xn,[X]_原=0,X1X2...X_n$

若 $X=-X_1X_2...Xn,[X]_原=1,X1X2...X_n$ 。

 对于定点小数：

 $X=+0.X_1X_2...Xn,[X]_原=0.X1X2...X_n$

 $X=-0.X_1X_2...Xn,[X]_原=1.X1X2...X_n$

补码

定点整数

$$
\left[ X \right] _{\text{补}}=\begin{cases}
	X,&		X\,\,\ge 0\\
	2^{n+1}+X&		X\,\,< 0\\
\end{cases}
\\
$$

$[X]_{补}=2^{n+1}+X(mod \,\,2^{n+1})$

定点小数
$$
\left[ X \right] _{\text{补}}=\begin{cases}
	X,&		X\,\,\ge 0\\ 2+X&		X\,\,\ < 0\\
\end{cases}
$$

$[X]_{补}=2+X(mod \,2)$

模2补码，two's complement

2、表示方法：最高位为符号位，其他位为数值位。

 符号位：0－正数，1－负数。
数值位：正数时，与绝对值相同；负数时，为绝对值取反后，末位加 1。

| [x]= | X0   | X1   | X2   | X3   |
| ---- | ---- | ---- | ---- | ---- |
| 权   | -2^3 | 2^2  | 2^1  | 2^0  |

真值=加权求和


### 补码表示方法

**对于定点整数：**

若 $X = +X_1X_2\cdots X_n$，则 $[X]_{\text{补}} = 0.X_1X_2\cdots X_n$

若 $X = -X_1X_2\cdots X_n$，则 $[X]_{\text{补}} = 1.\overline{X_1}\overline{X_2}\cdots\overline{X_n} + 1$

**对于定点小数：**

若 $X = +0.X_1X_2\cdots X_n$，则 $[X]_{\text{补}} = 0.X_1X_2\cdots X_n$

若 $X = -0.X_1X_2\cdots X_n$，则 $[X]_{\text{补}} = 1.\overline{X_1}\overline{X_2}\cdots\overline{X_n} + 0.00\cdots 1$

---

### 0 的表示

0 的补码表示形式是唯一的，即分别按照正数和负数表示均一致，为全零。

$$[+0]_{\text{补}} = 00\cdots 0$$

$$[-0]_{\text{补}} = 00\cdots 0$$

---

### 表示范围

对于 $n+1$ 位补码机器数 $X$，它所能表示的数据范围为：

- 定点整数：$-2^n \le X \le 2^n - 1$

- 定点小数：$-1 \le X \le 1 - 2^{-n}$




# （3）补码运算

 补码的符号位同数值位一起参加运算
 可以将减法转化为加法
 简化了运算器的结构

 计算机中的整型数据（int）均用补码来表示反码

定点整数


$$[ \mathbf{X} ] _{\text{反}} = \left\{ \begin{array}{l l} \mathbf{X} & \mathbf{X} \geq 0 \\ 2 ^{n + 1} - 1 + \mathbf{X} & \mathbf{X} \leq 0 \end{array} \right.$$

$$mod(2 ^{n + 1} - 1)$$



 定点小数 

$$[ \mathrm{X} ] _{\text{反}} = \left\{ \begin{array}{l l} \mathrm{X} & \mathrm{X} \geq 0 \\ 2 - 2 ^{- n} + \mathrm{X} & \mathrm{X} \leq 0 \end{array} \right.$$



$mod(2-2^{-n})$

表示方法：最高位为符号位，其他位为数值位。
 符号位：0－正数，1－负数。
 数值位：正数时，与绝对值相同；负数时，为绝对值取反

双值位，正数时，与绝对值怕问，贝数的，为绝对值取汉

### 反码表示方法

**对于定点整数：**

若 $X = +X_1X_2\cdots X_n$，则 $[X]_{\text{反}} = 0.X_1X_2\cdots X_n$

若 $X = -X_1X_2\cdots X_n$，则 $[X]_{\text{反}} = 1.\overline{X_1}\overline{X_2}\cdots\overline{X_n}$

**对于定点小数：**

若 $X = +0.X_1X_2\cdots X_n$，则 $[X]_{\text{反}} = 0.X_1X_2\cdots X_n$

若 $X = -0.X_1X_2\cdots X_n$，则 $[X]_{\text{反}} = 1.\overline{X_1}\overline{X_2}\cdots\overline{X_n}$

（1）0的表示：0的反码表示有两种形式

$$\begin{array}{r l} {[ + 0 ] _{\text{反}} = 0 0 \dots 0} \end{array}$$

$$[ - 0 ] _{\text{反}} = 1 1 \dots 1$$



（2）表示范围：对于n+ 1位反码机器数X，它所能表示的数据范围为：

定点整数：$- (2^n-1) \le X \le 2^n-1$

定点小数:$-(1-2^{-n}) \le X \le 1-2^{-n}$

移码

定点整数

$$[ \mathrm{X} ] _{\text{移}} = 2 ^{\mathrm{n}} + \mathrm{X}$$

$$(\mod 2 ^{n + 1})$$

2、表示方法：最高位为符号位，其他位为数值位。

 符号位：1－正数，0－负数。
 数值位：正数时，与绝对值相同；负数时，为绝对值取反后，末位加 1。

值位，正效的，与绝对值怕问，贝双的，为绝对值耿反旧，不位加

# 对于定点整数：

移码=补码的 符号位取反

### 移码表示方法

**对于定点整数：**

若 $X = +X_1X_2\cdots X_n$，则 $[X]_{\text{移}} = 1.X_1X_2\cdots X_n$

若 $X = -X_1X_2\cdots X_n$，则 $[X]_{\text{移}} = 0.\overline{X_1}\overline{X_2}\cdots\overline{X_n} + 1$

---

### 0 的表示

0 的移码表示形式是唯一的。

$$[+0]_{\text{移}} = 10\cdots 0$$

$$[-0]_{\text{移}} = 10\cdots 0$$

---

### 表示范围

对于 $n+1$ 位移码机器数 $X$，它所能表示的数据范围为：

- 定点整数：$-2^n \le X \le 2^n - 1$

# 四种定点机器数的对比

# 1、表示方法

# 表示方法

## 定点整数

| 真值 | $X = + X_1 X_2 \dots X_n$ | $X = - X_1 X_2 \dots X_n$ |
|------|---------------------------|---------------------------|
| 原码 | $[X]_{\text{原}} = 0 X_1 X_2 \dots X_n$ | $[X]_{\text{原}} = 1 X_1 X_2 \dots X_n$ |
| 反码 | $[X]_{\text{反}} = 0 X_1 X_2 \dots X_n$ | $[X]_{\text{反}} = 1 \overline{X_1} \overline{X_2} \dots \overline{X_n}$ |
| 补码 | $[X]_{\text{补}} = 0 X_1 X_2 \dots X_n$ | $[X]_{\text{补}} = 1 \overline{X_1} \overline{X_2} \dots \overline{X_n} + 1$ |
| 移码 | $[X]_{\text{移}} = 1 X_1 X_2 \dots X_n$ | $[X]_{\text{移}} = 0 \overline{X_1} \overline{X_2} \dots \overline{X_n} + 1$ |

---

## 定点小数

| 真值 | $X = + 0.X_1 X_2 \dots X_n$ | $X = - 0.X_1 X_2 \dots X_n$ |
|------|-----------------------------|-----------------------------|
| 原码 | $[X]_{\text{原}} = 0.X_1 X_2 \dots X_n$ | $[X]_{\text{原}} = 1.X_1 X_2 \dots X_n$ |
| 反码 | $[X]_{\text{反}} = 0.X_1 X_2 \dots X_n$ | $[X]_{\text{反}} = 1.\overline{X_1} \overline{X_2} \dots \overline{X_n}$ |
| 补码 | $[X]_{\text{补}} = 0.X_1 X_2 \dots X_n$ | $[X]_{\text{补}} = 1.\overline{X_1} \overline{X_2} \dots \overline{X_n} + 0.00\dots 1$ |
| 移码 | $[X]_{\text{移}} = 1.X_1 X_2 \dots X_n$ | $[X]_{\text{移}} = 0.\overline{X_1} \overline{X_2} \dots \overline{X_n} + 0.00\dots 1$ |

---

## 特殊值（+0 和 -0）

| 真值 | $X = +0$ | $X = -0$ |
|------|----------|----------|
| 原码 | $[X]_{\text{原}} = 0\,00\dots 0$ | $[X]_{\text{原}} = 1\,00\dots 0$ |
| 反码 | $[X]_{\text{反}} = 0\,00\dots 0$ | $[X]_{\text{反}} = 1\,11\dots 1$ |
| 补码 | $[X]_{\text{补}} = 0\,00\dots 0$ | $[X]_{\text{补}} = 0\,00\dots 0$ |
| 移码 | $[X]_{\text{移}} = 1\,00\dots 0$ | $[X]_{\text{移}} = 1\,00\dots 0$ |

---

## $n+1$ 位机器数表示范围

| | 定点整数 | 定点小数 |
|---|---------|---------|
| 原码 | $-(2^n - 1) \leq X \leq 2^n - 1$ | $-(1 - 2^{-n}) \leq X \leq 1 - 2^{-n}$ |
| 反码 | $-(2^n - 1) \leq X \leq 2^n - 1$ | $-(1 - 2^{-n}) \leq X \leq 1 - 2^{-n}$ |
| 补码 | $-2^n \leq X \leq 2^n - 1$ | $-1 \leq X \leq 1 - 2^{-n}$ |
| 移码 | $-2^n \leq X \leq 2^n - 1$ | $-1 \leq X \leq 1 - 2^{-n}$ |

---

## 原码 → 真值

$$
\begin{aligned}
&[X]_{\text{原}} = X_S \, X_1 X_2 \dots X_n \\
&X_S = 0 \Rightarrow X = + X_1 X_2 \dots X_n \\
&X_S = 1 \Rightarrow X = - X_1 X_2 \dots X_n
\end{aligned}
$$

---

## 反码 → 真值

$$
\begin{aligned}
&[X]_{\text{反}} = X_S \, X_1 X_2 \dots X_n \\
&X_S = 0 \Rightarrow X = + X_1 X_2 \dots X_n \\
&X_S = 1 \Rightarrow X = - \overline{X_1} \overline{X_2} \dots \overline{X_n}
\end{aligned}
$$

---

## 补码 → 真值

$$
\begin{aligned}
&[X]_{\text{补}} = X_S \, X_1 X_2 \dots X_n \\
&X_S = 0 \Rightarrow X = + X_1 X_2 \dots X_n \\
&X_S = 1 \Rightarrow X = - \left( \overline{X_1} \overline{X_2} \dots \overline{X_n} + 1 \right)
\end{aligned}
$$

---

## 移码 → 真值

$$
\begin{aligned}
&[X]_{\text{移}} = X_S \, X_1 X_2 \dots X_n \\
&X_S = 1 \Rightarrow X = + X_1 X_2 \dots X_n \\
&X_S = 0 \Rightarrow X = - \left( \overline{X_1} \overline{X_2} \dots \overline{X_n} + 1 \right)
\end{aligned}
$$
# 浮点数格式

浮点数N的构成：
$$N = M \times R ^{E}$$

阶码E（Exponent）、尾数M（Mantissa）和阶码的底R（Radix)
阶码的底R：是一个常数，隐含规定，一般为2、8或16

为什么将数符放置在首位？

将数符放置 在首位，方 便比较大小







| 数符 | 阶符 | 阶码(指数，定点整数) | 尾数（系数，定点小数） |
| ---- | ---- | -------------------- | ---------------------- |
| Ms   | Es   | E1E2...Em .          | M1M2...Mn              |

浮点数格式要素：

1. 位数：阶码位数$^ +$尾数位数→总位数
2.  编码：阶码和尾数采用的机器数编码
3. 排列顺序：数符是否在最高位
4. 其他特殊的编码规则：譬如隐藏位

# 尾数M：定点小数


$$0. 1 0 1 1 1 0 \times 2 ^{- 2} = 0. 0 0 1 0 1 1 1$$

$$N = M \times R ^{E}$$

尾数的位数：决定了浮点数有效数值的精度

·尾数的符号：数符，代表了浮点数的正负

·尾数的编码：一般采用原码和补码表示

# 阶码E：定点整数

·阶码的位数：多少决定了浮点数的表示范围
·阶码的数值：大小决定了数据实际小数点位置与尾数的小数点位置之间的偏移量
·阶码的符号：阶符，决定了实际小数点位置在尾数的小数点位置的左边还是右边
·阶码的编码：一般采用移码和补码表示

# 阶码的底R：一般为2、8或16，且隐含规定



# 非规格化浮点数：

规格化操作：修改阶码和左右移尾数的方法来使其变为规格化浮点数
右规：尾数进行右移实现的规格化
左规：尾数进行左移实现的规格化

# 什么情况下要做规格化操作？

尾数有前导零：即 $<1/2$ ，需要左规
尾数运算溢出：即≥1，需要右规

# 使用规格化浮点数表示数据的优点：

提高了浮点数据的精度
使程序能够更方便地交换浮点数据
可以使浮点数的运算更为简化

# （自定义格式）规格化浮点数表示方法：

（1）写出数据的二进制真值
(2）转换为M×2的形式，其中M为没有前导零的定点小数，E为整数
（3）按照格式写出M和E的规定机器数编码
（4）按照格式要求排列E和M

浮点数的运算过程中，尾数发生溢出（超出尾数所能表示的范围），进行右规。右规一次即可。

阶码发生溢出时，浮点数被判为溢出



# 1. 一些小结论

由于补码表示的最大值和最小值是非对称的

即最大值的绝对值(0111)的原码比最小值的绝对值的(1000)原码要小

对于 n 位定点整数的机器数则为 $( n + 1)$ 位（算上符号位）

## 对于一个负数 \(X\) 来说，原码 + 补码 的性质

### 核心结论

对于负数 \(X\)，其原码和补码的**数值部分**（即去掉符号位后的 \(n\) 位）之和等于 \(2^n\)。

$$
\text{数值部分}([X]_{\text{原}}) + \text{数值部分}([X]_{\text{补}}) = 2^n
$$

其中：

- \(n\) 为数值位位数（不含符号位）
- \(n+1\) 为机器字长（含符号位）

---

### 含义

**负数的补码 = 模数 − 该负数的绝对值**

即：

$$
\text{数值部分}([X]_{\text{补}}) = 2^n - |X|
$$

因此：

$$
|X| + \text{数值部分}([X]_{\text{补}}) = 2^n
$$

---

### 示例验证

以 \(X = -2\)，\(n = 3\)（4 位机器数）为例：

- \([-2]_{\text{原}} = 1010\)，数值部分为 \(010_2 = 2_{10}\)
- \([-2]_{\text{补}} = 1110\)，数值部分为 \(110_2 = 6_{10}\)

相加：

$$
2 + 6 = 8 = 2^3
$$

如果用完整的机器数相加（含符号位）：

$$
1010 + 1110 = 11000
$$

- 保留 \(n+1\) 位（4位）的结果为 \(1000\)，即 \(8_{10} = 2^3\)
- 完整进位结果为 \(11000_2 = 24_{10}\)，这是 \(2^{n+1} + 2^n = 16 + 8 = 24\)

---

### 严谨表述

**对于完整的 \(n+1\) 位机器数（含符号位）**：

$$
[X]_{\text{原}} + [X]_{\text{补}} = 2^{n+1} + 2^n
$$

因为：

- \([X]_{\text{原}} = 2^n + |X|\)
- \([X]_{\text{补}} = 2^n + (2^n - |X|) = 2^{n+1} - |X|\)

相加：

$$
(2^n + |X|) + (2^{n+1} - |X|) = 2^n + 2^{n+1}
$$

---

### 另一种理解

将 \([X]_{\text{补}}\) 当成原码（符号位不变）并去掉符号位，剩下的 \(n\) 位数值为：

$$
2^n - |X|
$$

这正是负数补码的**补数**含义。

对于 \(X = -2\)，\(n = 3\)：

- \([X]_{\text{补}} = 1110\)
- 当成原码（符号位 \(1\) 表示负）去掉符号位 → \(110_2 = 6_{10}\)
- \(2^3 - 2 = 8 - 2 = 6\) 

---

### 公式总结

| 项目 | 公式 |
|------|------|
| 数值部分相加 | 数值部分\(([X]_{\text{原}})\) + 数值部分\(([X]_{\text{补}})\) = \(2^n\) |
| 完整机器数相加（含符号位） | \([X]_{\text{原}} + [X]_{\text{补}} = 2^n + 2^{n+1}\) |
| 补码的补数含义 | 数值部分\(([X]_{\text{补}}) = 2^n - \|X\|\) |

---


还是上个例子。[-2]补 $= 1 1 1 0 = 1 4$，$2 + 1 4 = 1 6$ ；

所以，有符号数和无符号数之间的转换规则是：

位模式不变，但是解释这些位的方式改变了

数值数据的表示

进位计数制

不同数制之间的转换

十进制的编码

机器数

数值数据在计算机中的表示形式称为机器数。机器数的特点是：

$^\ast$ 机器数：数值数据在计算机中的二进制表示形式。真值：机器数真正表示的数值数据

·机器数的符号位必须被数值化为二进制0和1书写：+/-符号数值（二进制或
·机器数的小数点用隐含规定的方式来表达
·表示的数值范围受计算机字长的限制
·编码方法：不同的排列方式，常见的有原码、反码、补码、移码。



# 定点机器数的表示方法

一个字节由 8 个位组成

我们把这种按照一位一位表示数据的方式称为位模式

对于无符号数编码

在机器中的解释，采用原码表示法（？）





For vector \(\vec{x} = [x_{w-1}, x_{w-2}, \cdots, x_0]\) :

\[\vec{x}_{w-1} \quad \vec{x}_{w-2} \quad \cdots \quad \vec{x}_0\]

\[B 2U_w(\vec{x}) \triangleq x_{w-1} \cdot 2^{w-1} + x_{w-2} \cdot 2^{w-2} + \cdots + x_0 \cdot 2^0\]



对于有符号数的编码，采用补码

# Two's Complement Encodings

For vector \(\vec{x} = [x_{w-1}, x_{w-2}, \cdots, x_0]\):

\[\vec{x}_{w-1} \quad \vec{x}_{w-2} \quad \cdots \quad \vec{x}_0\]

\[x_{w-1} \cdot -2^{w-1} + x_{w-2} \cdot 2^{w-2} + \cdots + x_0 \cdot 2^0\]

\[B2T_w(\vec{x}) \triangleq -x_{w-1} 2^{w-1} + \sum_{i=0}^{w-2} x_i 2^i\]



对于相同的位模式，无符号数和有符号数的数值关系如图所示：

（这里的 B2U/B2T 是位向量到无符号数和有符号数的函数映射）

最高位理解成负权重$-2^{w-1}$


$$B 2 U _{w} = x _{w - 1} \cdot 2 ^{w} + B 2 T _{w}$$用 T2U 来表示有符号数到无符号数的函数映射$T 2 U _{w} ( x ) = \left\{ \begin{array} {c} { { x + 2 ^{w} , x < 0 } } \\ { {x , x > 0} } \end{array} \right.$ $T 2 U _{w} \left( x \right) = \left( x + 2 ^{w} \right)$

$$U 2 T _{w} (u) = \left\{ \begin{array}{l} x, u \leq T M \max  _{u} \\ x - 2 ^{w}, u > T M a x _{u} \end{array} \right.$$W位(包含了符号位！)补码表示的数值$$\omega = - x _{\omega - 1} 2 ^{\omega - 1} + \sum_{i = 0}^{\omega - 2} x _{i} 2 ^{i}$$



也就是说，把最高位作为负数 $-2^{n}$ 来处理：正数符号位为 0，负数符号位为 1。

你可能已经发现，二进制数的“互补数”编码规则和补码的定义非常像，其实不是像，而是它们本来就是等价的。也就是“对应正数的互补数”等于“对应正数按位取反再加 1”。下面尝试证明。

原命题精确描述为：对于 $w$ 位的二进制数，整数 $b \in (0, 2^{w-1}]$，等式 $[X]_{\text{补}} = 2^w - b$ 

$-b=\sim b+1$成立，其等价形式为：$[X]_{\text{补}} = \overline{b} + 1$。

---

原码、补码、反码、移码的直接二进制值（机器数的形式值）各自有什么作用？

- **原码**：符号位 + 真值绝对值，直观但运算复杂。
- **反码**：负数按位取反，存在 $+0$ 和 $-0$。
- **补码**：统一加减法，无 $+0/-0$ 问题。
- **移码**：真值加上偏置值 $2^{n}$（或 $2^{n+1}$），便于浮点数指数比较。

---

反码、补码的真值为负数时，机器数形式值（符号位作为 $-2^{n}$ 处理，而不是正负号）减去对应的 $2^{n+1}$ 或 $2^{n+1} + 1$，就是这个机器数的真值。

移码无论正负，直接减去 $2^{n}$（或 $2^{n+1}$）即为真值。

而原码没有类似的性质。

![](78e6ebe0fa6d18716eca1d48f88e453ca73f8c16ae9fe3c381407ee46ef7c2df.jpg)

有符号数最高位为 0（正数），其余为 1

![](e3ecdb1331e495f2deeb4e6668c8da5f41e4d66251fb5eee1929cfca02758dec.jpg)

有符号数的-1和无符号数的最大值一样编码表示

![](d7ebf2a15fdae3ac42d3466cc5c4d421de2dfae73da3be0f75e1620b2f98e562.jpg)

# 2．真值与补码的转换

# 真值->补码

正数的补码：去掉 $^ +$ 号前面加 0。

负数的补码：1、去掉 - 号前面加 1，从右到左找到第一个 1，左边全部取反。

2、负数的补码是将原码的符号位保持不变,其余各位取反，然后加1,就得到其补码;

计算一个负数的补码时，通常遵循以下步骤：

1. 取绝对值的二进制表示：求出绝对值（即对应正数），求出数值的二进制形式。
2. 取反：将二进制数的每一位取反，即 0 变为 1，1 变为 $0 _{\circ}$
3. 加 1：在取反结果的基础上加 1，得到最终的补码表示。

也就是说，符号位参与了运算。在第 2 步实际上已经将“符号位为 1“表示成 0-1

实际上，这个符号位啊，你无论是先不管符号位取反再上符号位为 1，还是一起从绝对值取反（从0变成1—），不都是符号位为1吗？但参与 $+ 1$ 运算是必须的。

# 补码- $\cdot >$ 真值

符号位 0 的补码的真值：去掉 0 前面加 $^ +$ 号。

符号位1的补码的真值：

1、去掉 1 前面加-号，从右到左找到第一个 1，左边全部取反。
2、负数的原码就是它的补码的补码。
3、如果补码的符号位为“1”，表示是一个负数，那么补码减1,再将符号位保持不变其余各位取反

# 3.对于 $( X + 2 \land( \mathbf{n } + 1 ) )$ mod (2^(n+1))的解释

对某两个整数a，b，若它们除以正整数 $\mathsf{m }$所得的余数相等，则称a，b对于模m同余，也就是严格来说，存在整数k使得$a - b = k m$，则称 a,b 对于除数$\mathsf{m }$是同余的。一般记做$$a \equiv b (\bmod m)$$在模运算中，一个数与它除以“模”后得到的余数是等价的，如 A、B、M 满足$\mathsf{A } {=} \mathsf{B } {+} \mathsf{K } {\times} \mathsf{M } ( \mathsf{K }$为整数)，则记为$\mathsf{A } \equiv \mathsf{B } ( \mathsf{m o d } \mathsf{M } )$)，即 A、B各除以 M后的余数相同。在补码运算中，[A]补-[B]补=[A]补$+ \mathsf{M }$-[B]补，而 M-[B]补$=$ [-B]补，因此补码可以借助加法运算来实现减法运算。从模运算的角度，补码的表示利用了以下规律：

模运算的同余性质：对于任意整数 a 和模数 $\mathsf{m }$，有$\mathsf{a } \equiv \mathsf{a } + \mathsf{k m } ( \mathsf{m o d } \mathsf{m } )$，其中 k为整数。这意味着在模$\mathsf{m }$的运算中，数值是循环的，超过$\mathsf{m }$ 会回到起点。

为何常见写法是 $^{6 6} x + 2 \wedge _{ \mathsf{n } + 1 }$mod$\mathsf{\pm } \mathsf{\Lambda } \mathsf{n } \mathsf{\pm }^{\prime}$1”而不是$\pmb{\times }$mod$^{2 n + 1}$数论上，$^{*} \times$与$\mathsf{x } + 2 \wedge \{ \mathsf{n } + 1 \} \times ^{\prime \prime}$在模$2 \cdot \{ \mathsf{n } + 1 \}$ 下等价；

但在说明“补码如何把负数映射到二进制的高半区”时，显式地加上 $2 \times \{ \mathsf{n } + 1 \}$更能直观反映“负数被搬到了高位$\ O = \uparrow$ 的区间”这个事实。

 非负数直接写成“它自己” (因为落在小半区间 $[ 0 , 2 \land \mathsf{n } ) ]$ )；
 负数写成 $^{ \mathfrak{a } } \mathsf{X } + 2 ^{\wedge} \{ \mathsf{n } + 1 \}^{\prime \prime}$(因为这样就落在大半区间$[ 2 \land \neg , 2 \land \{ \mathsf{n } + 1 \} - 1 ] ) _{\circ}$在计算机系统中，$\mathsf{n }$位定点整数（包括符号位）补码的取值范围是$- 2 \land \mathsf{n }$到$2 \ n _{ \mathsf{n } } - 1$ 。

这意味着总共有 $2 \cdot \{ \mathsf{n } + 1 \}$个不同的数值可以表示。因此，模数$2 \cdot \{ \mathsf{n } + 1 \}$ 对应于这些数值的总数量。

负数的表示：在模 $2 \cdot \{ \mathsf{n } + 1 \}$的系统中，负数 X 可以表示为$2 \wedge \{ \mathsf{n } + 1 \} + \mathsf{X } ,$,因为 X 为负数，会落在$2 \land( \mathsf{n } )$到$2 \cdot \{ \mathsf{n } + 1 \} - 1$ 的范围内，符合无符号数的表示范围。

因为模为 $2 \cdot( n + 1 ) , k = 1$ $k = 1$，那么就可以将-$2 ^{\wedge} \mathsf{n } - 2 ^{\wedge} \mathsf{n } - 1$统一成$( X {+} 2 ^{\wedge} ( \mathsf{n } {+} 1 ) )$) mod$( 2 \land( \mathsf{n } + 1 ) )$

减法（加上一个负数）的运算用加法代替了，我们说的补码（反码）实际上是数对于一个模的同余数。

（这里的取模运算，请让我们抛弃符号数，eg.-2 mod $8 {=} 6$,$[ 6 ] {=} 1 1 0$,而 [-2]补$\mathord{= } 1 1 1 0$ ，当成原码，去掉符号位）

规定：把0当成正数，也即 $+ 0$，这样0的编码就变成：0，0000000。那8位二进制表示的正数范围仍然是：$+ 0 -- + 1 2 7 _{ \mathrm{{(} } }$ 。

但是，对于负数就必须要做调整，也即-0必须要让位---1，0000000这个编码不能表示-0。我们可以把负数整体向后“挪动1位”：只要将8位二进制表示的负数范围从：-127—— -0变成：-128 —— -1，就能成功解决问题。

-0 的补数是 $2 5 6 - 0 = 2 5 6 = 0 \times 1 0 0$，由于是“8 位二进制数”，所以-0 的补数是$0 \times 0 0$；‘我们知道“-$\cdot 1 = 0 - 1 \prime$ ，所以

-1 的补数是 $2 5 6 - 1 = 2 5 5 = 0 \times 1 =$ ；这就好比是"0-1"不够减，"借 256"得到的（这里借的是模数值）。

同理，可以-2~-127的补数；

注意：这里的补数，就是计算机所讲的补码。

-127 的补数是 $2 5 6 - 1 2 7 = 1 2 9 = 0 \times 8 1$-1~-127 的补码范围：$0 {\times} \mathsf{F F } {\sim} 0 {\times} 8 1$

负数-128的补码：

我们知道“- $\cdot 1 2 8 = 0 - 1 2 8 ^{\prime \prime}$，“$- 1 2 8 = - 1 + - 1 2 7 ^{\prime \prime}$ 所以

-128 的补数是 $2 5 6 - 1 2 8 = 1 2 8 = 0 \times 8 0$ ；所以-128 的补码为 0x80，但是-128 没有原码和反码。所以人为地规定 10000000 表示-128

总结：

补码补码，就是补上去一个模对应的补数

# 小结

在一个区间长度为 M 内，统一正负数的常用方法是


$$X ^{\prime} = (X + M) \mod M$$其中 M 就是模数。如果你换成一个非 M 的倍数 N，则只有在$\Nu \equiv 0$ (mod M)的情况下才能达到同样效果。因此，负数加上的部分必须是 M 的倍数，通常取最小正倍数 M 来实现统一。

可以这么理解：如果一个区间（或集合）恰好包含 $\mathsf{m }$个整数，并且这$\mathsf{m }$个整数构成了一个模$\mathsf{m }$的完全剩余系，那么对任意整数 X，用$$X \bmod m$$总能得到落在这个集合中的唯一代表。换句话说，只要这个集合包含的元素个数为 m（而且互不同余），那么无论 X是正数还是负数，都有$$X \equiv X \bmod m$$

而且 Xmodm 就是该模 m 意义下的标准表示。

# 为什么定点小数的模 2？

至于模数为 2 的说法，这是因为补码表示中，数值的表示是循环的。例如，-1 和 $1 - 2 \land( - \mathsf{n } )$之间的差值正好是$2 - 2 \land( - \mathsf{n } )$ ，但由于补码的循环特性，这个差值在模 2 的意义下是等价的。$- 2 \land( - \mathsf{n } )$并没有被省略，而是补码表示的范围已经包含了从 -1 到$1 - 2 \land( - \mathsf{n } )$ 的所有可能值。补码的模数为 2 是因为补码表示中，数值的表示是循环的，且循环周期为 2。

# 关于数的扩展

基本上是这样的。对两类数来说：

高位扩展（符号扩展）：
低位扩展（增加精度）：

# 定点整数的符号扩展：

对于无符号数，称为零扩展

对于有符号数，称为符号位扩展

在原符号位和数值位中间添加新位，正数都添0，负数原码添0，负数反、补码、移码添1。


$$\begin{array}{l} B 2 T _{w} \left(\left[ x _{w - 1}, x _{w - 2}, \dots , x _{0} \right]\right) (1) \\ B 2 T _{w + k} \left(\left[ x _{w - 1}, \dots , x _{w - 1}, x _{w - 1}, \dots , x _{0} \right]\right) (2) \\ B 2 T _{w + 1} - B 2 T _{w} = 0 \\ \end{array}$$

# 定点小数的符号扩展：

在原符号位和数值位后面添加新位，正数都添0，负数原、补码、移码添0，负数反码添1。

# 低位截断

将 int 类型强制转换为 short 类型，高 16 位被丢弃

将一个 $\pmb{\mathsf{W } }$位的无符号数，截断成k位的方法是，丢弃最高的w-k位。截断操作可以对应于取模运算。$$B 2 U _{w} \left(\left[ x _{w - 1}, x _{w - 2}, \dots , x _{0} \right]\right) \mod 2 ^{k} = B 2 U _{k} \left(\left[ x _{k - 1}, x _{k - 2}, \dots , x _{0} \right]\right)$$
# 截断有符号数

先转换成无符号数，再截断，再转换成有符号数

即
$$T ^{2} U _{w} (x) = \left\{ \begin{array}{c} x + 2 ^{w}, x <   0 \\ x, x > 0 \end{array} \right., \text{即} T 2 U _{w} (x) = (x + 2 ^{w}) \mod 2 ^{w}$$

$$B 2 T _{k} \left(\left[ x _{k - 1}, \dots , x _{0} \right]\right) = U 2 T _{w} \left(\left[ B 2 T _{w} \left(\left[ x _{w - 1}, x _{w - 2}, \dots , x _{0} \right]\right) + 2 ^{w} \right] \mod 2 ^{w} \right] \mod 2 ^{k}) = U 2 T _{w} \left(B 2 U _{w} \left(\left[ x _{w - 1}, x _{w - 2}, \dots , x _{0} \right]\right) \mod 2 ^{k}\right)$$

# 4、其他运算符

# 布尔运算（位级运算）

~/NOT 非（取反）（单目运算）

&/AND 与

|/OR 或

^/EXCLUSIVE-OR 异或

取反的时候：

因此，可以总结出~按位取反的计算结论是： $\sim \mathsf{n } = - ( \mathsf{n } + 1 )$例如本例中，$\mathord{\sim } 5 = - ( 5 + 1 )$，即$\mathord{\sim } 5 = - 6$

# 逻辑运算

所有非零参数为 true，参数 0 表示 false

结果只有两个，true与false 惰性运算

|| OR

&& AND

! NOT

# 移位运算

逻辑移位。将移位的数据视为无符号数据，移位的结果知识数据位置发生了变化。移出的数据位一般置入CF标志位(进位、借位 标志)

算术移位，对象是有符号数，算术移位的结果在绝对值上进行放大缩小；符号位保持不变。

计算机的算术移位指令大多采用补码的 移位规则

循环移位，左移时最高位移入最低位，右移时最高位移入最低为，若和CF标志位一起循环，则称为大循环，否则小循环

左移相当于乘以2，右移相当于除以二

CF: 进位/借位标志。最近的操作使最高位产生了进位。可用来检査无符号操作的溢出。 加法运算时 $\textstyle \sum = 1$,则CF置1表示进位；减法运算时$C {=} 0 , C F$ 置1表示借位。CF只对无符号数运算有意义。

ZF: 零标志。最近的操作得出的结果为 0（全零）则 ZF 置 1。
SF: 符号标志。记录运算结果的符号，它与运算结果的最高位相同。采用补码表示，运算结果为正数置0，负数置1。
OF: 溢出标志。最近的操作导致一个补码溢出——正溢出或负溢出。有符号数有意义。有溢出则置1，否则置0；
PF:奇偶标志位。操作数 1 的个数为偶数置 1，否则置 0；

# 左移

逻辑左移，高位移出，低位补0

左移不区分算术还是逻辑

对于原码的算术左移，符号位不变，高位移出，低位补 0；

当左移移出的数据位为“1”时，发生溢出。

对于补码的算数左移。符号位不变，高位移出，低位补0；当左移移出的数据位正数为1负数为0时（符号位与被移出的位不同），发生溢出。一次。为保证不发生溢出，移位数据的最高有效位必须与符号位相同

因此，在硬件补码实现算数左移时，直接将数据的最高有效位移入符号位，当不发生溢出时，不会改变机器数的符号

# 右移

逻辑右移，低位移出，高位补0

对于原码的算数右移，符号位不变，低位移出，高位补0

算数右移

对于补码，符号位不变，低位移出，高位补符号位

对于原码，符号位不变，低位移出，高位补0

C语言中一个特性就是支持按位进行布尔运算（位运算）

位运算的用法就是实现掩码运算

特定的位序列

比如说和0xFF，进行与运算，就是其本身

