jef*_*yer 14 c bit-manipulation
右移大于0的数字1应为0,对吗?然而,我可以输入这个打印1的非常简单的程序.
#include <stdio.h>
int main()
{
int b = 0x80000000;
int a = 1 >> b;
printf("%d\n", a);
}
Run Code Online (Sandbox Code Playgroud)
在linux上用gcc测试过.
Ste*_*non 30
6.5.7按位移位运算符:
如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义.
显然,编译器有权做任何事情,但最常见的行为是完全消除表达式(以及依赖于它的任何东西),或者简单地让底层硬件为超出范围的转换做任何事情.许多硬件平台(包括x86和ARM)都会屏蔽一些低位,以用作移位量.实际的硬件指令将给出您在这两个平台上观察到的结果,因为移位量被屏蔽为零.因此,在您的情况下,编译器可能已经优化了移位,或者可能只是让硬件做它做的任何事情.如果您想知道哪个,请检查组件.
归档时间: |
|
查看次数: |
1695 次 |
最近记录: |