繁体   English   中英

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

[英]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_tunsigned shortint为32位时)。 转换为unsigned使我们可以完全控制整数提升规则。


现在,OP想要将此数字转换为int16_t ,如果a >= 128int16_t产生负数。 如果你真的打算这样做,你可以非常肯定你正在使用二进制补码系统,所以一个简单的static_cast就足够了。 否则,您可以使用单独的支票。 再次,有点奇怪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM