1
2
链接的问题特别指出,如果移位量大于被移位类型的位宽度,则调用 undefined behavior ,标准将其定义为“使用不可移植或错误的程序结构或错误的数据时的行为,本国际标准对此不作任何要求” 当您调用未定义的行为时,任何事情都可能发生。程序可能会崩溃,可能会输出奇怪的结果,或者看起来工作正常。此外,如果在同一个编译器上使用不同的编译器或不同的优化设置,未定义的行为表现形式本身可能会发生更改。 C标准对第6.5.7P3节中的按位移位运算符规定如下:
在这种情况下,编译器可能会减少按您建议的位宽度进行模移位的量,也可能会将其视为按该量进行数学移位,从而导致所有位都为0。因为标准没有指定行为,所以两者都是有效的结果。 |
2
1
不确定的一个原因是8086,最初的x86, 不 屏蔽移位计数中的任何位。相反,它实际执行的移位,使用每个位置一个时钟滴答。 英特尔随后意识到,允许一个移位指令有255+个时钟周期可能不是一个好主意。例如,它们可能考虑了最大中断响应时间。 从我以前的80286手册:
对于PC/XT和PC/AT上的同一个程序,结果是不同的。 那么,语言标准应该怎么说呢? Java通过不使用底层硬件解决了这个问题。相反,C选择说效果还不清楚。 |
Xirema · 如何正确编写运算符的R值重载 7 年前 |
Mário Feroldi · 在运行时调用代码中未调用的函数 7 年前 |
chqrlie · 所有位0都可以是整数的陷阱表示吗? 7 年前 |
Vincent · 打印零,但不基于该条件退出循环 7 年前 |
Dror K. · 用%p打印空指针是未定义的行为? 7 年前 |
Bite Bytes · C中允许这种函数调用吗 7 年前 |
K J Gor · C中strncpy的内存混淆 8 年前 |