【发布时间】: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<short int>(x) 而不是static_cast?
我试过了,两者都给了我相同的结果。假设bit_cast 会给使用我的代码的其他人提供相同的结果,而static_cast 可以给他们不同的结果是否正确?
【问题讨论】:
-
result的类型应该是std::vector<unsigned short>。值中间的位无法成为有符号类型的符号位。 -
@AlanBirtles
x是unsigned short int不是short int -
@PeteBecker 怎么会?这正是我的问题代码中发生的情况。中间位成为有符号类型的符号位。
-
如果 unsigned short 大于 short int 的限制怎么办?
-
只是一个旁注——你为什么要修改源数据?你通常应该通过引用声明迭代变量
const。
标签: c++ types casting type-conversion