意外(IMO)恒定转换警告

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了意外(IMO)恒定转换警告相关的知识,希望对你有一定的参考价值。

考虑以下代码:

#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结果,因此警告。

bitwise logic

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

整数促销

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

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

以上是关于意外(IMO)恒定转换警告的主要内容,如果未能解决你的问题,请参考以下文章

生成代码文档时如何消除意外缩进警告的原因?

编写代码片段的更简洁的方法

关于 GNU ARM 汇编程序的意外警告

Python - 警告:意外错误:<class 'IndexError'>

Xcode8:"subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0" 的警告(代码片段

为啥我在使用 RemoteFileTemplate 时会在日志中收到意外的 RuntimeException 警告?