C++ 将两个uint8\t转换为int16\t的正确现代方法 uTn8t转换为一个代码> a[0] << 8 | a[1]

C++ 将两个uint8\t转换为int16\t的正确现代方法 uTn8t转换为一个代码> a[0] << 8 | a[1],c++,c++11,bit-shift,uint8t,C++,C++11,Bit Shift,Uint8t,这里有一种转换为uint16\u t的方法(稍后我们将讨论int16\u t) constexpr std::uint16\u t组合(std::uint8\u t a,std::uint8\u t b) { 返回static\u cast(a)=128。如果您真的打算这样做,您可以非常肯定您使用的是2的补码系统,因此一个简单的static\u cast可能就足够了。否则,您可以使用单独的检查。同样,有点奇怪。不知道什么可以满足clang tidy的要求,但您将希望使用a[0]在左移之前先将其移

这里有一种转换为
uint16\u t
的方法(稍后我们将讨论
int16\u t

constexpr std::uint16\u t组合(std::uint8\u t a,std::uint8\u t b)
{

返回static\u cast(a)=128
。如果您真的打算这样做,您可以非常肯定您使用的是2的补码系统,因此一个简单的
static\u cast
可能就足够了。否则,您可以使用单独的检查。同样,有点奇怪。

不知道什么可以满足clang tidy的要求,但您将希望使用
a[0]
在左移之前先将其移到
int16\t
,否则将导致
uint8\t
左移8位,并丢失位。@JeremyFriesner Clang Tidy说“使用带符号整数操作数和二进制位运算符”@ JeremyFriesner -我可能错了,但是C++标准的副本说,<代码>操作数应该是整数或非范围枚举类型,并且执行整数提升。结果的类型是提升左操作数的类型。< /代码>对我来说,意味着<代码> A[ 0 ]。@selbie和a
uint8\u t
将被提升到什么位置?这与评论中提到的叮当整洁的信息如何匹配?如果
a[0],预期的结果是什么>=128
?一个负数?@Chipster,因为
uint16\u t
可能会被提升为
int
。还有一个好问题。抱歉,刚刚意识到它实际上是
int16\u t
,而不是
uint16\u t
。无论如何,OP在
int16\u t
中不需要它吗?为什么要提升为int?我肯定错过了什么东西B有问题。我不明白为什么
uint16\u t
可以升级为int。如果我没有犯错误,这种类型保证是无符号的。@Fareano或者假设
uint16\u t
无符号的short
并且
int
是32位。然后,根据N3337,
无符号的short
升级为
int
。让我们来看看。
constexpr std::uint16_t combine(std::uint8_t a, std::uint8_t b)
{
    return static_cast<unsigned>(a) << 8 | static_cast<unsigned>(b);
}