文章目录
- 线索栏
- 笔记栏
-
- 1.信息的基石:二进制位
- 2.三种核心的数字表示
- 3.计算机运算的特性与后果
-
- 1)有限性导致的溢出
- [2)整数 vs. 浮点数运算](#2)整数 vs. 浮点数运算)
- 4.程序员为何必须理解这些?
- 【旁注1:怎样阅读本章】
- 【旁注2:C编程语言的演变与编译】
- 总结
线索栏
- 现代计算机表示一切信息的基石是什么? 为什么选择它,而不是十进制?
- "位+解释" 这一核心模式如何让我们表示万物?
- 本章将重点研究哪三种最重要的数字表示/编码?它们分别用于表示什么?
- 整数运算和浮点数运算在数学属性上有何根本不同?根源是什么?
- 为什么程序员必须了解数据的位级表示和运算属性?(三个原因)
- (旁注)C语言有哪些主要标准版本?GCC如何指定编译标准?
- (旁注)阅读本章数学内容时,应采用什么方法?
笔记栏
本章核心:探究计算机如何用有限的二进制位表示数字(整数、实数),以及这些表示方式如何决定了运算的属性和局限性。
1.信息的基石:二进制位
1)事实
所有信息均以二值信号(位/Bit) 表示。
2)选择二进制的原因
(1)物理实现简单可靠:易于用物理状态表示(穿孔、电压、磁场方向)。
(2)电路简单可靠:使得超高密度集成成为可能(芯片上数十亿电路)。
3)"位+解释"模式
单独的位无用,但将位组合在一起并赋予解释,就能表示任何有限集合的元素(如数字、字符)。
2.三种核心的数字表示
(1)无符号编码:表示大于等于零的整数。
(2)补码编码:表示有符号整数(正、负、零)的最常用方式。
(3)浮点数编码:基于二进制科学计数法,近似表示实数。
3.计算机运算的特性与后果
1)有限性导致的溢出
用有限位表示数字,结果超出范围时会发生溢出,可能导致反直觉的结果。
例子:在32位int系统中,200 * 300 * 400 * 500 结果为负数 -884,901,888,但运算保持一致(满足结合律/交换律)。
2)整数 vs. 浮点数运算
(1)整数:表示范围较小,但精确。运算具有许多熟悉的整数算术属性(如结合律)。
(2)浮点数:表示范围大,但近似。运算不具有结合性等属性。
(3)例子:(3.14+1e20)-1e20 结果为 0.0,而 3.14+(1e20-1e20) 结果为 3.14。
4.程序员为何必须理解这些?
(1)正确性与可移植性:确保程序在所有数值范围和不同机器上行为正确。
(2)安全性:许多安全漏洞源于算术运算的微妙细节。
(3)理解底层代码:是学习机器级编程(第3章)和编译器优化的基础。
【旁注1:怎样阅读本章】
(1)方法:内容以"原理→示例与讨论→(推导)"的结构呈现。
(2)建议:重在建立直觉,理解原理和启示。初次阅读可跳过复杂推导,通过练习题巩固。
【旁注2:C编程语言的演变与编译】
(1)标准版本:贝尔实验室C → ANSI C (C89)→ ISO C90 → ISO C99 → ISO C11。后续大多向后兼容。
(2)GCC编译选项:用 -std= 指定标准,如 -std=c11。-ansi 指代 C90。
总结
本章开篇确立了计算机世界的根本表示法------二进制,并指出"位+解释"是构建一切数字表示的通用范式。核心任务是掌握无符号、补码、浮点数这三种将二进制模式映射到数学意义的编码方案。
关键认知在于:由于表示是有限的,计算机算术并非完美的数学运算。整数运算精确但可能溢出;浮点数运算范围大但是近似的,且不遵守结合律。这种"有限性"与"近似性"是程序中错误和安全漏洞的潜在根源。
因此,深入理解位级表示,是程序员编写正确、可靠、可移植、安全代码的必备基础,也是通往机器级思维的关键一步。旁注提供的阅读方法和语言背景,为后续的学习提供了实用的方法论和历史语境。