|
|
1
2
链接的问题特别指出,如果移位量大于被移位类型的位宽度,则调用 undefined behavior ,标准将其定义为“使用不可移植或错误的程序结构或错误的数据时的行为,本国际标准对此不作任何要求” 当您调用未定义的行为时,任何事情都可能发生。程序可能会崩溃,可能会输出奇怪的结果,或者看起来工作正常。此外,如果在同一个编译器上使用不同的编译器或不同的优化设置,未定义的行为表现形式本身可能会发生更改。 C标准对第6.5.7P3节中的按位移位运算符规定如下:
在这种情况下,编译器可能会减少按您建议的位宽度进行模移位的量,也可能会将其视为按该量进行数学移位,从而导致所有位都为0。因为标准没有指定行为,所以两者都是有效的结果。 |
|
2
1
不确定的一个原因是8086,最初的x86, 不 屏蔽移位计数中的任何位。相反,它实际执行的移位,使用每个位置一个时钟滴答。 英特尔随后意识到,允许一个移位指令有255+个时钟周期可能不是一个好主意。例如,它们可能考虑了最大中断响应时间。 从我以前的80286手册:
对于PC/XT和PC/AT上的同一个程序,结果是不同的。 那么,语言标准应该怎么说呢? Java通过不使用底层硬件解决了这个问题。相反,C选择说效果还不清楚。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 9 月前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 10 月前 |
|
|
Bobby · 复合字面值总是左值吗? 10 月前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 10 月前 |