c++ - C++ int 提升动机的限制
问题描述
整数提升的工作原理是将低等级的所有事物提升为int
or 或uint
。但为什么会这样呢?
区分“升级”和“降级”类型是有意义的。当您将 a 转换short
为 a 时,char
您可能会丢失数据。
然而,当排名上升时(bool -> char -> short -> int -> long -> long long),没有机会丢失数据。如果我有 a char
,将其转换为 ashort
或 an都没关系int
,我仍然不会丢失任何数据。
我的问题是为什么 int 只能从排名较低的类型进行提升int
?为什么做出这样的决定?例如,为什么不朝向下一个更高排名的类型(然后从那里继续,例如再次尝试提升)。
在我看来,当您尝试描述隐式转换语义时,它们似乎有点武断。“大多数int
类型都可以“提升”,这意味着不会丢失数据的转换,但提升仅适用于int
,而不仅仅是任何更高级别的类型。如果您将任何内容转换为除此之外的其他内容int
,则称为转换“
使用 int 类型的实际等级来尝试一系列“提升”不是更简单吗?或者只是将任何向更高排名的转化称为“促销”?
PS这是一个教育问题,不是一个特定的编程问题,而是出于我自己的好奇心。
解决方案
在 C 标准中,第 6.3.1.8 节描述了“通常的算术转换”。(在 C99 中添加,链接到 C11 草案)
许多期望算术类型的操作数的运算符会以类似的方式导致转换和产生结果类型。目的是确定操作数和结果的通用实数类型。
C99 Rationale V5.10将其原因描述为:
添加了显式许可证以执行比绝对必要的“更宽”类型的计算,因为这有时可以生成更小更快的代码,更不用说更频繁地正确答案了。只要获得相同的最终结果,也可以通过 as if 规则以“更窄”的类型执行计算。显式转换始终可用于获取所需类型的值。
从基本原理来看,可以合理地推断委员会认为这是捕获最多可能用途的最简单的解决方案。
从简单的角度来看,拥有逐级晋升系统将大大增加实施标准所需的细节。它还会在不同位大小的平台之间产生各种各样的性能问题。寻求使用数据类型实现特定目标的程序员仍然可以通过显式类型转换获得灵活性。
推荐阅读
- c# - C# UWP 卡片小部件?
- arrays - 循环一个字节数组以将 64 位转换为十进制
- javascript - 文件未缓存在 ServiceWorker 中
- css - SVG 超过了弹性项目容器
- flutter - 可增长数组的“状态不佳:元素太多”,但整个堆栈都在 Flutter 内部,没有我的任何代码
- mapbox - Mapbox GL JS V2 中 3D 地形的自定义 DEM
- matlab - 用 MATLAB 解决概率问题
- database - 使用阿姆斯壮公理证明 AD->B
- ios - 异步调用导致 EXC_BAD_INSTRUCTION 崩溃
- android - 在使用 Navigation 组件和 Kotlin 进行导航时向 backstack 添加额外的片段