【问题标题】:Right shift operation on 32 bit variable32位变量的右移操作
【发布时间】:2020-03-31 14:15:53
【问题描述】:

我想对一个 32 的变量做 33 的右移并将结果存储到一个浮点变量中。

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

但是当我执行 1717986812 / (1

【问题讨论】:

  • 将 32 位整数移位超过 32 位的结果未定义。
  • 假设是 1717986812。当我们右移 33 位时,我们期望值是 0.2。 你的依据是什么?将signed int1717986812 右移任意位置是int,其值不能为0.2,即使假设它的宽度足以移动33 个位置。
  • 确认你确实想除以 2^33
  • C11 §6.5.7 Bitwise shift operators ¶3: 对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。。将 32 位整数右移 32 位或更多位是未定义的行为 - 结果是不可预测的(并且不会自动为零)。

标签: c 64-bit bit-shift 32-bit fixed-point


【解决方案1】:

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

等等等等?不?位移是一个整数活动,所以出现一个浮点结果会很神奇。将一个整数右移整个整数所包含的更多位,“逻辑上”会导致 0,但在 C 中它恰好是未定义的。

如果你想除以一个浮点值,就这样做:

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

当我在线测试时,它打印了0.2

【讨论】:

  • 考虑 x /= powf(2, 33)x /= 0x1p33fx *= 0x1p-33fx = ldexpf(x, -33)
  • @EricPostpischil 当然,我有点试图过于清楚(并且半希望这也是编译器可以接受的东西)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
相关资源
最近更新 更多