C 32位变量的右移操作

C 32位变量的右移操作,c,64-bit,bit-shift,32-bit,fixed-point,C,64 Bit,Bit Shift,32 Bit,Fixed Point,我想对32变量进行33的右移,并将结果存储到浮点变量中 对于“假设”,该值为1717986812。当我们右移33时,我们期望值为0.2 但当我做1717986812/(1 假设值为1717986812。当我们右移33时,我们期望值为0.2 Wait Wait?No?位移位是一个整数活动,因此出现浮点结果将是非常神奇的。将整数向右移位由整个整数组成的更多位,“逻辑上”将导致0,但在C中它恰好是未定义的 如果要除以浮点值,只需执行以下操作: float x = 1717986812; x /= po

我想对32变量进行33的右移,并将结果存储到浮点变量中

对于“假设”,该值为1717986812。当我们右移33时,我们期望值为0.2

但当我做1717986812/(1 假设值为1717986812。当我们右移33时,我们期望值为0.2

Wait Wait?No?位移位是一个整数活动,因此出现浮点结果将是非常神奇的。将整数向右移位由整个整数组成的更多位,“逻辑上”将导致0,但在C中它恰好是未定义的

如果要除以浮点值,只需执行以下操作:

float x = 1717986812;
x /= powf(2, 33);
printf("got %g\n", x);

这是我在线测试时打印的
0.2

将32位整数移位超过32位的结果是未定义的。假设值为1717986812。当我们右移33时,我们期望值为0.2。你基于什么?右移
有符号int
1717986812
任意数量的places是一个
int
,其值不能为
0.2
,即使假定其宽度足以移位33位。请确认是否确实要除以2^33C11:对每个操作数执行整数提升。结果类型为提升后的左操作数。如果右操作数的值为负或大于或等于被提升的左操作数的宽度,行为是未定义的。右移位32位整数由32个或更多个地方是未定义的行为-结果是不可预测的(并且不是自动为零)。考虑<代码> x/= POWF(2, 33)< /C>→
x/=0x1p33f
x*=0x1p-33f
,或者
x=ldexpf(x,-33)
@EricPostpischil当然,我有点想说得太清楚了(并且半希望这也是编译器可以学会的)。