[英]Proper modern way of converting two uint8_t into int16_t
什么是将两个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中的现场演示 )
确保可移植性的一种方法是首先将uint8_t
值转换为unsigned int
以确保可预测的整数提升。 无论uint8_t
别名类型如何,都会保留该值,因为unsigned int
保证能够保存低于256的所有非负整数,并且无符号整数转换规则保证保留该值。 然后,保证操作在unsigned int
上操作而不是有符号整数类型。
问题:为什么要转换为
unsigned
? 您正在将类型混合在一起。 为什么不直接转换为uint16_t
?
请注意,使用static_cast<uint16_t>(a)
不是可移植的解决方案,因为根据环境, uint16_t
仍可能被提升为int
(例如,当uint16_t
为unsigned short
且int
为32位时)。 转换为unsigned
使我们可以完全控制整数提升规则。
现在,OP想要将此数字转换为int16_t
,如果a >= 128
, int16_t
产生负数。 如果你真的打算这样做,你可以非常肯定你正在使用二进制补码系统,所以一个简单的static_cast
就足够了。 否则,您可以使用单独的支票。 再次,有点奇怪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.