【问题标题】:C++ convert an unsigned int in range [0, 2^n) to signed int in range [-2^(n-1), 2^(n-1) )C++ 将 [0, 2^n) 范围内的无符号整数转换为 [-2^(n-1), 2^(n-1) ) 范围内的有符号整数
【发布时间】:2022-11-18 08:35:05
【问题描述】:

一开始,我意识到我的所作所为很糟糕。如果没有明确禁止的话,我依赖于现在(至少)未定义的行为。它曾经有效,我认为我很聪明。现在它没有,我正在尝试修复它。

我有 2 的正幂数(FFT bin 索引,但不重要)。我想通过将值的后半部分包装到负范围来有效地对一组 bin 索引进行 FFT 移位。也就是说,给定 FFT 大小为 512,

0 ... 255 -> 0 ... 255
256 ... 511 -> -256 ... -1

曾经工作的是

template <size_t N>
struct Wrapper {
    int val : N;
};

auto constexpr index = 42u;
auto wrapper = Wrapper<9>{ index }; // warning: invalid narrowing conversion from "unsigned int" to "int"
auto val = wrapper.val; // signed value

这依赖于溢出分配的截断,但经过经验测试和 Just Worked(tm)。

现在,它不能(干净地)编译。

我现在应该如何执行此转换?

【问题讨论】:

    标签: c++ bit-fields


    【解决方案1】:

    怎么样:

    auto val = wrapper.val & (1 << 9) ? long(wrapper.val) - (1 << 9) : long(wrapper.val);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 2016-04-23
      • 2019-11-09
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多