【问题标题】:Portable conversion from unsigned to signed in C++在 C++ 中从无符号到有符号的可移植转换
【发布时间】:2021-12-31 00:48:12
【问题描述】:

我有std::vector<unsigned short int> vals,我需要反转字节的顺序(假设2)并将它们存储为short int。我这样做是:

std::vector<short int> result;
for(unsigned short int& x : vals) {
    x = ((x << 8) | (x >> 8));
    result.push_back(static_cast<short int>(x));
}

在线阅读,我发现static_cast 具有实现定义的行为。我还找到了std::bit_cast,它保留了这些位并在新类型中解释它们。

这是否意味着应该优先使用上面的std::bit_cast&lt;short int&gt;(x) 而不是static_cast

我试过了,两者都给了我相同的结果。假设bit_cast 会给使用我的代码的其他人提供相同的结果,而static_cast 可以给他们不同的结果是否正确?

【问题讨论】:

  • result 的类型应该是std::vector&lt;unsigned short&gt;。值中间的位无法成为有符号类型的符号位。
  • @AlanBirtles xunsigned short int 不是 short int
  • @PeteBecker 怎么会?这正是我的问题代码中发生的情况。中间位成为有符号类型的符号位。
  • 如果 unsigned short 大于 short int 的限制怎么办?
  • 只是一个旁注——你为什么要修改源数据?你通常应该通过引用声明迭代变量const

标签: c++ types casting type-conversion


【解决方案1】:

如果你想处理字节 - 你不应该将它们转换为非字节类型(尤其不是short int 和朋友,因为它们不需要完全是 16 位)。 您应该将字节读取为charstd::byte 的数组。然后,您可以以安全且可移植的方式交换这些值。 以可移植的方式将这些字节转换为数字类型是不可行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2012-11-18
    • 2013-01-22
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多