gpt4 book ai didi

c++ - 将两个 uint8_t 转换为 int16_t 的正确现代方法

转载 作者:太空狗 更新时间:2023-10-29 21:31:46 25 4
gpt4 key购买 nike

将两个 uint8t 转换为一个满足 clang-tidy 要求的 int16_t 的正确现代 C++ 方法是什么?

a[0] << 8 | a[1]

如果 a[0] >= 128,我希望结果环绕,从而产生负值。

Clang-Tidy 消息是

Use of a signed integer operand with a binary bitwise operator

最佳答案

这是转换为 uint16_t 的一种方法(我们稍后会讨论 int16_t)

constexpr std::uint16_t combine(std::uint8_t a, std::uint8_t b)
{
return static_cast<unsigned>(a) << 8 | static_cast<unsigned>(b);
}

(C++11 中的 live demo)

确保可移植性的一种方法是首先转换 uint8_tunsigned int以确保可预测的整数提升。无论 uint8_t 别名的类型如何,该值都会被保留,因为 unsigned int保证能够容纳 256 以下的所有非负整数,并且无符号整数转换规则保证该值得以保留。然后,这些操作保证在 unsigned int 上运行而不是有符号整数类型。

Question: why convert to unsigned? You are mixing types together. Why not convert to uint16_t directly?

请注意,使用 static_cast<uint16_t>(a)相反,不是可移植解决方案,因为 uint16_t可能仍会被提升为 int取决于环境(例如,当 uint16_tunsigned shortint 为 32 位时)。转换为 unsigned让我们完全控制整数提升规则。


现在 OP 希望将此数字转换为 int16_t ,如果 a >= 128 则为负数.如果您确实打算这样做,您可以非常确定您使用的是二进制补码系统,所以一个简单的 static_cast可能就足够了。否则,您可以使用单独的支票。同样,有点奇怪。

关于c++ - 将两个 uint8_t 转换为 int16_t 的正确现代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57319676/

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