(学习笔记)2.2 整数表示(2.2.3 补码编码)

文章目录


线索栏

  1. 补码编码的数学定义是什么?公式 B 2 T w B2T_w B2Tw如何解释?
  2. 在补码中,最高有效位(符号位)的权重是多少?它如何决定数值的正负?
  3. 给定一个位向量,如何手动计算其补码值?(请以 1011为例)
  4. w位补码能表示的范围是多少? T M i n w TMin_w TMinw和 T M a x w TMax_w TMaxw的位模式与数值是什么?为什么范围是不对称的?
  5. 函数 B 2 T w B2T_w B2Tw是否也是双射?其反函数是什么?
  6. 对于不同的字长(w=8,16, 32, 64),关键的数值(UMax, TMin, TMax, -1, 0)是多少?它们的十六进制和二进制模式有何规律?
  7. (旁注)为什么需要 stdint.h中的 intN_t类型?如何正确打印这些类型的值?
  8. (旁注)除了补码,有符号数还有哪两种表示方法?它们的定义和主要缺点是什么?

笔记栏

1. 补码的定义与解释

1)数学定义

对于位向量 x ⃗ = x w − 1 , x w − 2 , . . . , x 0 \vec{x}=x_{w−1},x_{w−2},...,x_0 x =xw−1,xw−2,...,x0,其表示的补码值为: B 2 T w ( x ⃗ ) ≐ − x w − 1 ⋅ 2 w − 1 + i = ∑ i = 0 w − 2 x i ⋅ 2 i B2T_w (\vec{x})\doteq−x_{w−1} \cdot2^{w−1}+i=\sum_{i=0}^{w-2} x_{i} \cdot2i B2Tw(x )≐−xw−1⋅2w−1+i=i=0∑w−2xi⋅2i

2)核心思想

最高有效位(MSB) x w − 1 x_{w−1} xw−1​作为符号位,权重为 − 2 w − 1 −2^{w−1} −2w−1(负权重)。其余位权重为正,与无符号编码相同。

(1)符号位 = 0:值为非负(0∼ 2 w − 1 2^{w−1} 2w−1−1)。

(2)符号位 = 1:值为负( − 2 w − 1 −2^w−1 −2w−1∼−1)。

3)计算示例(w=4)

B 2 T 4 B2T_4 B2T4(0001) = 0*(-8) + 0 * 4 + 0 * 2 + 1 * 1 = 1
B 2 T 4 B2T_4 B2T4(0101) = 0*(-8) + 1 * 4 + 0 * 2 + 1 * 1 = 5
B 2 T 4 B2T_4 B2T4(1011) = 1*(-8) + 0 * 4 + 1 * 2 + 1 * 1 = -5
B 2 T 4 B2T_4 B2T4(1111) = 1*(-8) + 1 * 4 + 1 * 2 + 1 * 1 = -1

2. 补码的表示范围与唯一性

1)取值范围

(1)最小值 T M i n w TMin_w TMinw:位模式 10...0,值为 − 2 w − 1 −2^{w−1} −2w−1。

(2)最大值 T M a x w TMax_w TMaxw:位模式 01...1,值为 2 w − 1 2^{w−1} 2w−1−1。

(3)示例 (w=4): T M i n 4 TMin_4 TMin4 = -8(1000), T M a x 4 TMax_4 TMax4 = 7(0111)。

2)不对称性

∣ T M i n w TMin_w TMinw∣=∣ T M a x w TMax_w TMaxw​∣+1。因为0占用了非负数的一个编码,导致负数比正数多一个。

3)唯一性(双射)

函数 B 2 T w B2T_w B2Tw ​是位模式到区间 T M i n w TMin_w TMinw, T M a x w TMax_w TMaxw​的一一映射。其反函数记为 T 2 B w T2B_w T2Bw ​。

3. 关键数值与位模式(图2-14总结)

(1)TMin和 TMax的十六进制模式互补:TMin是最高位为1,其余为0;TMax是最高位为0,其余为1。

(2)-1​ 的位模式是全1,这与无符号数的最大值 UMax相同。这为类型转换埋下伏笔。

(3)UMax = 2 * TMax + 1。

4. C语言实现与可移植性

(1)几乎通用:几乎所有机器都用补码表示有符号整数。

(2)可移植性警告:C标准不强制要求补码。要编写最大可移植的代码,应仅依赖 <limits.h>定义的常量(如 INT_MAX),而非假设特定范围或表示。

(3)典型假设:多数程序假设补码和典型取值范围,这在实际中可广泛移植。

5. 旁注精要

1)确定大小的整数类型(<stdint.h>)

(1)类型:intN_t(有符号), uintN_t(无符号),N通常为8, 16, 32, 64。

(2)用途:确保精确位宽,对网络协议、二进制文件格式等至关重要。

(3)打印:使用宏(如 PRId32, PRIu64)生成正确的 printf格式串,保证跨编译环境正确。

2)Java的规定

强制使用补码,且各整数类型位宽严格固定(如 byte为8位)。

3)其他有符号表示法

(1)反码:符号位权重为 − ( 2 w − 1 − 1 ) −(2^{w−1}−1) −(2w−1−1)。缺点:存在 +0(00...0) 和 -0(11...1)。

(2)原码:最高位仅表示符号(0正1负),其余位表示绝对值。缺点:同样存在 +0和 -0。现代机器基本不用,但浮点数阶码部分使用。

6.练习题

练习题2.17

练习将十六进制数字解释为无符号数和补码数,并手动计算其十进制值。核心是理解同一串位,在不同解释(上下文)下,值不同。

练习题2.18

进一步练习根据补码编码公式 B 2 T w B2T_w B2Tw,将十六进制机器代码值转换为程序员可读的十进制值。这是理解机器级代码的基础。


总结栏

本节深入探讨了计算机表示有符号整数的标准方式------补码编码。

  1. 核心公式: B 2 T w ( x ) = − x w − 1 ∗ 2 w − 1 + Σ x i ∗ 2 i B2T_w(x) = -x_{w-1} * 2^{w-1} + Σ x_i *2^i B2Tw(x)=−xw−1∗2w−1+Σxi∗2i。其精髓在于赋予最高有效位负权重( − 2 w − 1 -2^{w-1} −2w−1),从而统一了正负数的表示。
  2. 关键范围:
    (1) T M i n w = − 2 w − 1 TMin_w = -2^{w-1} TMinw=−2w−1(模式:1后跟w-1个0)
    (2) T M a x w = 2 w − 1 − 1 TMax_w = 2^{w-1} - 1 TMaxw=2w−1−1 (模式:0后跟w-1个1)
    (3) 范围不对称(|TMin| =|TMax| + 1),这是由0的表示唯一性导致的。
  3. 重要模式:-1 表示为全1,0表示为全0。TMin和TMax的位模式互为"互补"。
  4. 唯一性:补码编码也是双射,保证了数值和位模式的一一对应。
  5. 编程实践:虽然补码无处不在,但C标准未强制规定,编写可移植代码应使用 <limits.h>和 <stdint.h>。Java则明确强制使用固定位宽的补码。

理解补码是理解整数运算、溢出和类型转换的基础。其设计巧妙之处在于,使用相同的加法器电路即可处理无符号数和有符号数(补码)的加法。

相关推荐
Chester_19994 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
知产xiao_xin5 小时前
知识产权入门 —— 相关权(邻接权)
经验分享·笔记·知识产权
EXI-小洲5 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
自小吃多6 小时前
DXF文件导入与PCB板框定义笔记
笔记·嵌入式硬件
会周易的程序员6 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导6 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan6 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_695251496 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
是隼人7 小时前
buuctf-pwn xdctf2015_pwn200题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
jike_20267 小时前
iPhone采访录音同时拍现场照片的APP:图片音频同步记录实测
笔记·智能手机·音视频·语音识别