按位移位中未定义与实现定义的行为
按位左移运算符 (
C 的未定义行为
根据 ISO C99,左移 a负操作数会导致未定义的行为。这是因为标准规定结果应该是左操作数和 2E2 的乘积,结果对结果类型的范围取模。然而,当左操作数为负数时,这样的计算可能会导致在有符号类型上下文中出现未定义的结果。
C 的良好定义行为
与C, C 指定左移无符号操作数会产生预期的数学乘法。但是,对于有符号类型,如果结果超出结果类型的可表示范围,C 还会定义未定义的行为。因此,在 C 中,左移负操作数仍然未定义。
发散的原因
C 采取不同方法的原因可能源于以下事实:由于潜在的溢出,负面行为已经未定义。将定义扩展为涵盖所有负数情况简化了标准并澄清了未定义的行为。
实现定义的右移行为
右移负操作数是实现 -在 C 和 C 中都有定义,因为它可能涉及符号扩展和零填充之间的选择。符号扩展保留空出位中的原始符号位,而零填充则用零替换它们。不同的编译器和平台可能会选择任一行为,因此具有实现定义的性质。
总结
在 C 中,无条件左移负操作数会导致未定义的行为。在 C 中,对于有符号类型也未定义此类操作。另一方面,由于符号扩展和零填充之间的选择,右移负操作数是两种语言中实现定义的。
以上是C 和 C 中按位移位的未定义行为和实现定义行为有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!