咨询Jens Gustedt《Modern C》中二进制表示相关段落的含义
《Modern C》相关段落含义解释
这段内容本质是讲C标准为了兼顾跨平台兼容性和运行效率做出的设计取舍,核心可以拆解为3个层面理解:
- 为什么C标准不把所有类型的运算结果完全定死
C的核心定位是贴近硬件的高性能编程语言,而市面上的硬件架构五花八门:比如有32位、64位的通用CPU,还有大量嵌入式领域的特殊架构,有符号整数有的用补码表示,部分老硬件用反码/符号幅值表示,浮点数也存在不遵循IEEE 754标准的实现。如果C标准强行统一所有类型的底层实现,那在不符合标准要求的硬件上跑C程序就必须加额外的兼容转换层,会直接损失运行性能,违背C的设计初衷。所以C标准只会规定类型的行为逻辑,不会强制统一底层的二进制存储规则。 - 怎么确定C程序运算的预期结果
虽然底层实现不统一,但C标准保证了运算结果是可预判的,只需要两个信息就能100%推导出运算结果:
- 参与运算的操作数本身的值
- 当前运行平台的类型特征参数
举个例子,size_t是用来表示内存大小的无符号类型,你想知道size_t a = SIZE_MAX; a += 1的结果,只需要查当前平台的SIZE_MAX值就可以:如果是32位平台SIZE_MAX是4294967295,加1之后就会溢出回绕到0;如果是64位平台SIZE_MAX是18446744073709551615,加1之后回绕到0的结果也是确定的。
这里提到的**二进制表示(binary representation)**就是当前平台上,某一个C类型的二进制比特位和实际数值的对应规则,这套规则只要确定了,这个类型所有运算的结果就都是固定的,不会出现不可预期的随机行为。
- 不需要查硬件手册就能拿到所有需要的平台参数
C标准规定了所有和类型相关的平台参数,都可以通过标准库直接获取,不需要你去查对应硬件的技术手册:比如整数的上下限可以通过<limits.h>里的INT_MAX、SIZE_MAX等宏拿到,浮点数的精度、上下限可以通过<float.h>里的DBL_EPSILON、DBL_MAX等宏拿到,类型占的字节数可以直接用sizeof运算符计算。也就是说这套二进制表示规则是完全可以通过C代码本身观测到的,没有隐藏信息。
内容的提问来源于stack exchange,提问作者dexter
相关产品推荐
相关产品推荐

