考虑以下代码:
#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
?
有人可以向我解释一下吗?
没有operator~
接受比int
短的整数。在~uint8_t(0x80)
uint8_t
首先被提升为int
,并返回int
结果,因此警告。
首先,运算符
&
,^
和|
对两个操作数执行通常的算术转换,运算符~
对其唯一的操作数执行整数提升。整数促销
整数提升是任意整数类型的值的隐式转换,其等级小于或等于
int
的等级或类型为_Bool
,int
,signed int
,unsigned int
的位字段,类型为int
或unsigned int
的值如果
int
可以表示原始类型的整个值范围(或原始位字段的值范围),则该值将转换为类型int
。否则,该值将转换为unsigned int
。