意外(IMO)恒定转换警告

问题描述 投票:-1回答:1

考虑以下代码:

#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

有人可以向我解释一下吗?

c++ c++11 gcc clang constexpr
1个回答
3
投票

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

bitwise logic

首先,运算符&^|对两个操作数执行通常的算术转换,运算符~对其唯一的操作数执行整数提升。

整数促销

整数提升是任意整数类型的值的隐式转换,其等级小于或等于int的等级或类型为_Boolintsigned intunsigned int的位字段,类型为intunsigned int的值

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

© www.soinside.com 2019 - 2024. All rights reserved.