【发布时间】:2020-04-08 07:14:24
【问题描述】:
我需要在 C++ 中将 24 位整数(2s 补码)转换为 32 位整数。我找到了一个解决方案here,它给出了
int interpret24bitAsInt32(unsigned char* byteArray)
{
return (
(byteArray[0] << 24)
| (byteArray[1] << 16)
| (byteArray[2] << 8)
) >> 8;
}
虽然我发现它正在工作,但我对这段代码有以下担忧。
byteArray[0] 只有 8 位,因此像 byteArray[0] << 24 这样的操作是如何实现的?
如果编译器将 byteArray 上转换为整数并执行操作,这将是可能的。这可能是它现在工作的原因。但我的问题是,这种行为是否在所有编译器中都得到保证并在标准中明确提及?这对我来说不是微不足道的,因为我们没有明确地向编译器提供目标是 32 位整数的任何线索!
另外,请让我知道任何像矢量化这样的即兴创作都可以提高速度(可能使用 C++11),因为我需要将大量 24 位数据转换为 32 位。
【问题讨论】:
-
请注意,您上面提供的代码不是 C++,因为
byte[] byteArray不是有效的 C++ 语法。这真的是关于 C++ 还是其他语言!?byte是什么类型? -
sizeof(int)不是必需的 4 虽然... -
@MichaelKenzel:有std::byte (C++17)
-
@Soo 不,你把它改成了
char,而不是unsigned char。 -
我不是 100% 确定,但我认为
<<运算符 promotes 在它进行转变之前它的论点。这里的其他人会更加确定。当然,24文字是int不是更短的。
标签: c++ c++11 binary bit-shift