关于《C程序设计:现代方法》中常规算术转换‘窄(narrow)’表述的疑问
关于《C程序设计:现代方法》中常规算术转换“窄(narrow)”表述的疑问
完全懂你的困惑!刚看到这段的时候我也卡了一下——毕竟直觉上我们都觉得要往「更宽」的类型转才不会丢精度,书里这个「窄」的说法确实容易让人误会。
其实你完全没理解错「要转成更宽类型保证精度」这个核心逻辑,问题出在书里这句话的表述角度上:
The strategy behind the usual arithmetic conversions is to convert operands to the “narrowest” type that will safely accommodate both values. (Roughly speaking, one type is narrower than another if it requires fewer bytes to store.)
这里的「narrowest」(最窄)是相对所有能安全容纳两个操作数的类型而言的,不是让你把操作数转成比原来更窄的类型(那肯定会丢精度,绝对不是C的设计逻辑)。换句话说,它的意思是:在所有能装下两个操作数所有可能值、不会丢失精度的类型里,选占用内存最少(也就是最「窄」)的那个类型来作为运算的目标类型。
举个实际例子:
- 如果你有一个
char(通常1字节)和一个int(通常4字节),能安全容纳两者的类型有int、long、long long等; - 其中「最窄」的就是
int——它刚好能装下char和int的所有可能值,没必要用更宽的long来浪费内存; - 这时候我们是把
char转成int,也就是往更宽的方向转,和你学的逻辑完全一致,只是书里是从「选最紧凑的合格类型」的角度来描述这个目标类型的。
简单来说,我们平时说的「转成更宽的类型」是转换的方向,而书里的「最窄的能容纳两者的类型」是最终目标类型的属性——它是所有符合安全要求的类型里最小的那个,同时又足够装下两个操作数的所有值。两者本质是一回事,只是表述切入点不同而已。
内容来源于stack exchange
相关产品推荐
相关产品推荐

