意外(IMO)常数转换警告

时间:2018-06-20 15:55:19

标签: c++ c++11 gcc clang constexpr

考虑以下代码:

#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吗?

有人可以向我解释吗?

1 个答案:

答案 0 :(得分:3)

没有operator~接受小于int的整数。在~uint8_t(0x80)中,uint8_t首先被提升为int,并返回int的结果,因此发出警告。

请参见bitwise logic

  

首先,运算符&^|在两个操作数上执行常规的算术转换,并且运算符~在其唯一的操作数上执行整数提升< / strong>。

     

整数促销

     

整数提升是对等级小于或等于int或等级_Boolint,{{ 1}},signed int到类型unsigned intint

的值      

如果unsigned int可以表示原始类型的值的整个范围(或原始位字段的值的范围),则该值将转换为类型int。否则,该值将转换为int