gpt4 book ai didi

c++ - C++中的24位到32位转换

转载 作者:行者123 更新时间:2023-12-01 14:53:57 37 4
gpt4 key购买 nike

我需要在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位。

最佳答案

int32_t interpret24bitAsInt32(unsigned char* byteArray)
{
int32_t number =
(((int32_t)byteArray[0]) << 16)
| (((int32_t)byteArray[1]) << 8)
| byteArray[2];
if (number >= ((int32_t)1) << 23)
//return (uint32_t)number | 0xFF000000u;
return number - 16777216;
return number;
}

通过将 1移到 int的符号位中,此函数应该执行所需的操作,而不会调用未定义的行为。
仅当 int32_t时才需要 sizeof(int) < 4强制转换,否则会默认将默认整数提升为 int

如果有人不喜欢 if:编译器(gcc 9.2)不会将其转换为条件跳转: https://godbolt.org/z/JDnJM2
它留下了 cmovg

关于c++ - C++中的24位到32位转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59346207/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com