
数据表示与运算核心目标掌握计算机如何用二进制表示各种数据整数、小数、字符以及ALU如何进行算术和逻辑运算。一、为什么计算机使用二进制核心原因二进制最简单、最可靠、最物理可实现。原因解释物理实现简单电路只需两种状态高电平(1) / 低电平(0)可用电压、电流、磁化方向表示运算规则简单二进制加法只有4种组合比十进制简单得多抗干扰能力强两种状态区分度大即使信号有一定衰减也能正确识别逻辑门实现方便与布尔代数完美对应真/假 1/0关键认识计算机内部所有数据——数字、文字、图像、音频、视频——本质上都是0和1的序列。二、进制转换1. 常见进制进制前缀/后缀示例应用场景二进制0b/B0b1010计算机内部八进制0/O017Unix文件权限十进制无 /D13人类日常十六进制0x/H0xFF内存地址、颜色编码2. R进制 ↔ 十进制R进制 → 十进制按权展开求和(1011.01)₂ 1×2³ 0×2² 1×2¹ 1×2⁰ 0×2⁻¹ 1×2⁻² 8 0 2 1 0 0.25 11.25十进制 → R进制整数部分除R取余倒序小数部分乘R取整正序将 13.625 转为二进制 整数部分13 ÷ 2 6 余 1 6 ÷ 2 3 余 0 3 ÷ 2 1 余 1 1 ÷ 2 0 余 1 → 倒序1101 小数部分0.625 × 2 1.25 → 取整 1 0.25 × 2 0.5 → 取整 0 0.5 × 2 1.0 → 取整 1 → 正序101 结果(13.625)₁₀ (1101.101)₂⚠️注意有些小数无法精确转换如0.1会在有限位数后截断导致浮点数精度问题。3. 二进制 ↔ 八进制/十六进制二进制→八进制每3位一组整数左补零小数右补零二进制→十六进制每4位一组(110101110.101)₂ → 八进制110 101 110 . 101 → (656.5)₈ → 十六进制0001 1010 1110 . 1010 → (1AE.A)₁₆三、定点数的表示定点数小数点位置固定。分为定点整数和定点小数。1. 真值与机器数真值实际数值带正负号如 13、-7.5机器数计算机中存储的二进制表示用符号位表示正负2. 无符号数所有位都表示数值没有符号位8位无符号数范围0 ~ 2550 ~ 2⁸-1n位无符号数范围0 ~ 2ⁿ-13. 有符号数的表示方法原码Sign-Magnitude最高位为符号位0正1负其余为数值位例5 0,0000101-5 1,0000101缺点零有两种表示0和-0加减运算需要额外判断符号反码One’s Complement正数与原码相同负数符号位不变数值位按位取反例-5 1,1111010缺点零仍有两种表示运算时需处理循环进位补码Two’s Complement⭐⭐⭐最重要、最常用现代计算机中整数统一使用补码表示和运算。正数与原码相同负数反码 1或模 - 真值例-5 的补码原码1,0000101→ 反码1,1111010→ 补码1,1111011优点零唯一表示加减法统一符号位参与运算无需单独处理补码求法速记方法1原码 → 反码除符号位取反 → 1 方法2从右往左找到第一个1它左边所有位取反符号位除外 方法3模运算2ⁿ - |真值|移码Excess-N / Offset Binary用于浮点数的阶码表示定义移码 真值 偏移量通常为 2ⁿ⁻¹特点便于比较大小与无符号数的顺序一致例8位移码偏移量1285 10000101即12851334. 三种表示法的对比真值原码反码补码50,00001010,00001010,0000101-51,00001011,11110101,111101100,00000000,00000000,0000000-01,00000001,11111110,0000000与0相同✓5. 定点数的范围n位整数1位符号 n-1位数值原码/反码-(2ⁿ⁻¹-1) ~ (2ⁿ⁻¹-1)补码-2ⁿ⁻¹ ~ (2ⁿ⁻¹-1)无符号0 ~ 2ⁿ-18位举例补码-128 ~ 127原码-127 ~ 127无符号0 ~ 255补码可以多表示一个负数因为零唯一所以-128的补码是10000000。四、定点数的运算1. 移位运算移位类型操作符号位空位填充用途逻辑左移整体左移参与右补0无符号数×2逻辑右移整体右移参与左补0无符号数÷2算术左移整体左移不变右补0有符号数×2算术右移整体右移不变左补符号位有符号数÷2⚠️算术左移注意若符号位改变则发生溢出2. 加减运算补码加减法⭐⭐⭐核心公式[A B]补 [A]补 [B]补 mod 2ⁿ [A - B]补 [A]补 [-B]补 [A]补 [B]补的变补 mod 2ⁿ减法变加法减去一个数 加上它的相反数的补码。这样硬件只需实现加法器溢出判断单符号位两个正数相加得负或两个负数相加得正 → 溢出双符号位运算结果的两个符号位不同 → 溢出01正溢10负溢进位判断最高数值位进位 ⊕ 符号位进位 1 → 溢出3. 乘法运算原码乘法符号位单独处理异或数值部分做绝对值乘法类似十进制竖式乘法累加移位补码乘法Booth算法⭐直接处理补码无需先转原码核心思想利用相邻位的变化来决定加/减/不移位适合硬件实现高效乘法溢出n位数乘n位数结果可能2n位若只保留n位高位丢失 → 溢出4. 除法运算原码除法符号位单独处理数值做绝对值除法补码除法加减交替法直接处理补码核心根据余数符号决定加除数还是减除数5. 标志位条件码运算结果会设置标志位供条件判断使用标志位名称含义ZF零标志结果全为0SF符号标志结果最高位补码即符号位CF进位/借位标志无符号数运算溢出OF溢出标志有符号数运算溢出PF奇偶标志结果低8位中1的个数为偶数AF辅助进位低4位向高4位进位五、浮点数的表示IEEE 754标准⭐⭐⭐ 浮点数 科学计数法的二进制版N (-1)ˢ × 1.M × 2ᴱ⁻¹²⁷1. 浮点数的格式┌───┬──────────┬──────────────────────────────┐ │ S │ E │ M (尾数/有效数) │ │ 1位│ 指数位 │ 尾数位 │ └───┴──────────┴──────────────────────────────┘精度总位数符号位指数位尾数位偏移量单精度float321823127双精度double641115210232. 规格化表示尾数最高位恒为1隐含所以实际精度比位数多1单精度实际精度24位双精度实际精度53位规格化范围1 ≤ |M| 23. 特殊值指数(E)尾数(M)含义全0全0±0全0非0非规格化数非常小的数1~254任意规格化数全1全0±∞正负无穷全1非0NaN非数字4. 浮点数运算步骤对阶将指数较小的数调整为与较大的数相同尾数右移尾数运算加减规格化确保尾数在 [1, 2) 范围内舍入按规则截断或进位溢出判断阶码是否超出范围⚠️经典陷阱0.1 0.2 ≠ 0.3在浮点数中因为0.1无法精确表示为二进制浮点数六、字符与字符串的编码1. ASCII编码7位编码128个字符0~127包括控制字符0~31、数字、字母、标点扩展ASCII8位256个字符含欧洲语言符号2. Unicode统一字符编码覆盖全球所有语言UTF-8变长编码1~4字节兼容ASCII互联网主流UTF-16变长编码2或4字节Java/C#内部使用UTF-32定长4字节3. 汉字的表示GB23126763个汉字双字节GBK21003个汉字向下兼容GB2312GB1803027484个汉字兼容GBKUnicode统一编码CJK统一汉字4. 字符串的存储C语言以\0结尾的字符数组其他方式长度前缀 字符数组大端/小端多字节字符在内存中的字节顺序5. 大端 vs 小端 ⭐方式含义举例0x12345678大端Big-Endian高位字节存放在低地址12 34 56 78人类阅读习惯小端Little-Endian低位字节存放在低地址78 56 34 12x86架构记忆法大端 大端在前高位在前小端 小端在前低位在前。x86 CPU是小端网络传输通常大端。七、校验码1. 奇偶校验码在数据后添加1位校验位使1的个数为奇数奇校验或偶数偶校验只能检测奇数个位错误不能纠错2. 海明码Hamming Code可检测并纠正1位错误核心在2的幂次位置1,2,4,8…放置校验位校验位覆盖特定位置的数据位若需检测d位错、纠正c位错需满足2ʳ ≥ d c 1r为校验位位数3. 循环冗余校验CRC⭐用于数据传输和存储的检错将数据视为多项式除以生成多项式余数作为校验码检错能力强能检测多位错误和突发错误硬件实现简单移位寄存器异或门八、重点回顾重点一句话总结进制转换整数除R取余小数乘R取整二-八进制3位一组二-十六进制4位一组原码符号位数值位零不唯一加减复杂反码负数数值取反零不唯一需循环进位补码负数反码1零唯一加减统一符号位参与运算移码真值偏移量用于浮点阶码便于比较浮点数IEEE 754符号位 阶码 尾数注意规格化和特殊值大小端大端高位在前网络小端低位在前x86校验码奇偶校验检错、海明码纠错、CRC强检错下章预告我们将探索计算机的记忆系统——存储器层次结构。从高速昂贵的寄存器到海量便宜的磁盘了解Cache如何让你的程序飞起来