考虑以下代码:
#include <iostream>
static constexpr uint8_t a = 0x80;
static constexpr uint8_t b = ~a;
它会产生以下警告:
<source>:5:30: warning: implicit conversion from 'int' to 'const uint8_t' (aka 'const unsigned char') changes value from -129 to 127 [-Wconstant-conversion]
static constexpr uint8_t b = ~a;
我不明白,为什么这里有溢出警告,此代码中没有显式int。我正在使用相同类型的变量。 删除constexpr时,更改为以下内容时警告会消失:
static constexpr uint8_t b = uint8_t{~a};
警告消失。看起来~
运算符会隐式将变量更改为int
吗?
有人可以向我解释吗?
答案 0 :(得分:3)
没有operator~
接受小于int
的整数。在~uint8_t(0x80)
中,uint8_t
首先被提升为int
,并返回int
的结果,因此发出警告。
请参见bitwise logic:
首先,运算符
&
,^
和|
在两个操作数上执行常规的算术转换,并且运算符~
在其唯一的操作数上执行整数提升< / strong>。整数促销
整数提升是对等级小于或等于
的值int
或等级_Bool
,int
,{{ 1}},signed int
到类型unsigned int
或int
如果
unsigned int
可以表示原始类型的值的整个范围(或原始位字段的值的范围),则该值将转换为类型int
。否则,该值将转换为int
。