Vin*_*ent 4 c c++ bit-shift undefined-behavior c++14
显然,右移操作的行为:
a >> b
Run Code Online (Sandbox Code Playgroud)
在C和C++中未定义b >= sizeof(a)*CHAR_BIT(而在正常情况下,由于右移而从左侧引入的"新位"等于零).
为什么这种未定义的行为比将结果设置为零更好b >= sizeof(a)*CHAR_BIT?
我们可以从为什么语言设计师容忍未定义的行为中选择未定义的行为来理解为什么语言会说:
这个答案来自C背后的两个一般设计原则:
- 该语言不应对实现施加任何不必要的开销.
- 在各种硬件上实现C应该尽可能简单.
在这种特定情况下,当我们使用大于位宽的移位计数时会发生什么情况将取决于架构,例如我在这里的答案中解释:
在某些平台上的移位数将被屏蔽,以5 bits例如在一个x86架构,我们可以看到英特尔®64和IA-32架构软件开发人员手册部分SAL/SAR/SHL/SHR-Shift键在IA-32架构兼容节说:
8086不掩盖班次计数.但是,所有其他IA-32处理器(从Intel 286处理器开始)确实将移位计数屏蔽为5位,最大计数为31. [...]
因此,在某些平台上实现任意计数的转移可能会很麻烦,因此最好不要使用不确定的行为.
为什么不指定未指明的行为
未指定的行为使实现者在翻译程序时具有一定的自由度.然而,这个范围没有扩展到未能翻译程序,因为所有可能的行为都是"正确的",因为它们不会在任何实现中导致未定义的行为.
因此,一定存在案例或者仍然存在行为不正确并且会出现问题的情况.
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |