当 b 大于 a 中的位数时,右移 (a >> b) 的未定义行为?

2023-12-20

显然,右移操作的行为:

a >> b

在 C 和 C++ 中未定义b >= sizeof(a)*CHAR_BIT(而在正常情况下,由于右移而从左侧引入的“新位”等于零)。

为什么这种未定义的行为比将结果设置为零更好b >= sizeof(a)*CHAR_BIT?


我们可以了解为什么语言选择未定义的行为为什么语言设计者容忍未定义的行为 http://www.drdobbs.com/cpp/why-language-designers-tolerate-undefine/240165466它说:

这个答案来自 C 背后的两个一般设计原则:

  1. 该语言不应给实现带来不必要的开销。
  2. 在各种硬件上实现 C 语言应该尽可能容易。

在这种特定情况下,当我们使用大于位宽的移位计数时会发生什么将取决于架构,例如我在我的文章中解释的那样在这里回答 https://stackoverflow.com/a/19636588/1708801:

在某些平台上,班次计数为masked to 5 bits例如在x86我们可以看到的架构英特尔® 64 和 IA-32 架构软件开发人员手册 http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf部分SAL/SAR/SHL/SHR—班次 in the IA-32 架构兼容性部分说:

8086 不屏蔽移位计数。然而,所有其他 IA-32 处理器(从 Intel 286 处理器开始)都会将移位计数屏蔽为 5 位,从而导致最大计数为 31。 [...]

因此,在某些平台上实现任意计数的移位可能会很麻烦,因此最好保留其未定义的行为。

为什么不是未指定的行为

如果我们看一下国际标准的基本原理——编程语言——C http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf它说:

未指定的行为为实现者提供了翻译程序的一定自由度。这个纬度 然而,并没有扩展到无法翻译程序,因为所有可能的行为 是“正确的”,因为它们不会在任何实现中导致未定义的行为。

因此,一定存在或仍然存在这种行为不符合的情况。correct并会出现不好的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 b 大于 a 中的位数时,右移 (a >> b) 的未定义行为? 的相关文章

随机推荐