为什么左移在 C 中对负值未定义,但在 C 中定义良好?
ISO C99 和 C 标准指定了不同的行为用于负值的左移运算。在 C 中,根据 ISO C99 标准第 6.5.7/4 节,移动负值会调用未定义行为 (UB)。这是因为定义仅清楚地说明了非负值的结果,而未定义负值的行为。
但是,ISO C -03 标准(第 5.8/2 节)明确定义了有符号类型的行为。如果移位后的值可以在结果类型中表示,则返回该值。否则,将调用未定义的行为。
为什么左移对负数的未定义行为?
左移操作的 ISO C99 定义没有指定会发生什么移位时高位为负值。这让实现来决定做什么,这可能会导致不同或不正确的结果。为了确保跨编译器的行为一致,默认行为是未定义的。
为什么右移的实现定义行为是负数?
与左移操作相反,右移操作不必处理从左开始的截断。因此,实现可以更轻松地为负值定义一致的行为。此行为可能因编译器和系统而异,但通常是算术(类似于 C 中的有符号右移)或逻辑(结果为零)。
结论
C 和 C 中负值的左移和右移运算行为不同的原因很大程度上是由于实现的难易程度。可以一致地为负值定义右移,而不会造成太大的复杂性,而左移必须截断位或指定不可移植的结果,这将导致编译器之间的行为不一致。
以上是为什么左移负数在 C 中未定义,但在 C 中定义(带有警告)?的详细内容。更多信息请关注PHP中文网其他相关文章!