|
|
1
2
链接的问题特别指出,如果移位量大于被移位类型的位宽度,则调用 undefined behavior ,标准将其定义为“使用不可移植或错误的程序结构或错误的数据时的行为,本国际标准对此不作任何要求” 当您调用未定义的行为时,任何事情都可能发生。程序可能会崩溃,可能会输出奇怪的结果,或者看起来工作正常。此外,如果在同一个编译器上使用不同的编译器或不同的优化设置,未定义的行为表现形式本身可能会发生更改。 C标准对第6.5.7P3节中的按位移位运算符规定如下:
在这种情况下,编译器可能会减少按您建议的位宽度进行模移位的量,也可能会将其视为按该量进行数学移位,从而导致所有位都为0。因为标准没有指定行为,所以两者都是有效的结果。 |
|
2
1
不确定的一个原因是8086,最初的x86, 不 屏蔽移位计数中的任何位。相反,它实际执行的移位,使用每个位置一个时钟滴答。 英特尔随后意识到,允许一个移位指令有255+个时钟周期可能不是一个好主意。例如,它们可能考虑了最大中断响应时间。 从我以前的80286手册:
对于PC/XT和PC/AT上的同一个程序,结果是不同的。 那么,语言标准应该怎么说呢? Java通过不使用底层硬件解决了这个问题。相反,C选择说效果还不清楚。 |
|
|
John Proctor · C中位的掩蔽范围 7 年前 |
|
|
Jakey · C枚举定义中的按位移位有什么作用? 7 年前 |
|
|
Areg Sarvazyan · 从无符号int中提取位的函数 7 年前 |
|
|
goodvibration · 实施安全左移 7 年前 |
|
|
AesSedai101 · Kotlin'shl'不工作 7 年前 |
|
|
Sam Hammamy · 如何在位运算中选择正确的左移位? 7 年前 |