c++ - g++ 警告 : conversion to uint16_t from int may alter its value

标签 c++ g++

根据高级 SO 用户的建议,我最近开始使用 -Wconversion 进行编译。在我的代码库上标记。这产生了很多警告,其中一些是合法的(例如,不必要地添加 signedunsigned 类型),但也产生了一些令人头疼的警告,如下所示:

#include <cstdint>

int main()
{
  uint16_t a = 4;
  uint16_t b = 5;

  b += a;

  return 0;
}

当我用 g++ -Wconversion -std=c++11 -O0 myFile.cpp 编译时,我明白了

warning: conversion to 'uint16_t {aka short unsigned int}' from 'int' may alter its value [-Wconversion]
    b += a;
      ^

我已经阅读了一些关于 SO(处理 |<< 运算符)的类似问题,查看了 here ,并阅读了数字促销和数字转换部分 here .我的理解是,为了做数学,ab晋升为int (因为这是第一种可以适合整个 uint16_t 值范围的类型),执行数学运算,结果被写回......除了数学结果是 int , 并将其写回 uint16_t生成警告。其他问题的共识基本上是抛弃警告,我想出如何做到这一点的唯一方法是b = (uint16_t)(b + a); (或等效的 b = static_cast<uint16_t>(b + a); )。

不希望这个问题过于笼统,但假设我对整数提升的理解是正确的......

  1. 处理这个问题的最佳方法是什么?我是否应该避免对小于 int 的类型执行数学运算? ?对我来说似乎很奇怪,我必须转换一个与所有操作数类型相同的算术结果(我想我希望编译器能够识别它并抑制警告)。从历史上看,我不喜欢使用比我需要的更多的位,只是让编译器根据需要处理提升/转换/填充。
  2. 任何人都使用-Wconversion经常挂旗?就在我自己使用了几天之后,我开始认为它最好的用例是打开它,看看它提示什么,修复合理的提示,然后再把它关掉。或者也许我对“合法投诉”的定义需要重新调整。替换我所有的+=带有明确强制转换的运算符似乎比什么都麻烦。

我很想将其标记为 c同样,因为等价的 c使用 gcc -Wconversion -std=c11 -O0 myFile.c 编译的代码产生完全相同的警告。但按原样,我正在使用 g++ x86_64 Fedora 23 机器上的 5.3.1 版。如果我错过了,请指点我;如果这里唯一的答案/建议是抛弃警告,那么这是一个骗局。

最佳答案

What's the best way to handle this moving forward?

-Wno-conversion

或者只是不指定它。不过,这只是一种意见。

根据我的经验,对窄整数运算的需求往往非常少,因此您仍然可以在项目中继续使用它,并在出现这种无用警告的少数情况下禁用它。但是,这可能在很大程度上取决于您的项目类型,因此您的体验可能会有所不同。

Should I avoid performing math on types narrower than int?

通常是的;除非您有特定的理由使用它们。 “我不需要额外的位” 在我看来,这不是一个足够具体的理由。算术操作数无论如何都会被提升为 int 并且使用 int 通常更快且更不容易出错。

Just after a couple of days of using it myself, I'm starting to think its best use case is to turn it on, look at what it complains about, fix the legitimate complaints, then turn it back off.

对于 -Wall-Wextra 中不包含的警告标志(例如带有 -Wsuggest-前缀。它们没有包含在“所有警告”中是有原因的。

关于c++ - g++ 警告 : conversion to uint16_t from int may alter its value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47543097/

相关文章:

c++ - 返回数组的一维?

c++ - C++:在不超时的情况下使用带有超时的future.get

c# - 桌面复制API捕获特定窗口

c++ - MinGW g++编译速度极慢

c++ - 如何将基类对象分配给派生类对象?

c++ - 为什么复制构造函数失败到 "copy"

c++ - Mingw32 是否支持 std::thread?

c++ - Nana 用 C++ 制作 GUI

c++ - undefined symbol : Symbol referencing errors. 没有输出写入 main

c++ - 相当奇怪的 clang 问题