避免使用无符号整数除法

Avoid signed by unsigned integer division

本文关键字:无符号整数 除法      更新时间:2023-10-16

我在执行以下代码时遇到了这个问题:

int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();

如果不对vi.size()进行int强制转换,则输出为垃圾,因为size()返回一个无符号整数。

若我并没有在谷歌上搜索一个矢量的参考,我永远不会明白这一点。有没有办法避免这个陷阱?对于-Wall-pedantic,gcc似乎没有对这种划分发出任何警告。

gcc-Wconversion标志,在这种情况下它会警告我:

warning: conversion to ‘int’ from ‘std::vector<int>::size_type {aka long unsigned int}’   may alter its value [-Wconversion]
     int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();
                                                            ^

gcc文件说:

-W转换

警告可能更改值的隐式转换。这包括实数和整数之间的转换,比如当x是双时的abs(x);有符号和无符号之间的转换,如无符号ui=-1;以及转换为较小类型,如sqrtf(M_PI)。不要对abs(((int)x)和ui=(unsigned)-1等显式强制转换发出警告,或者如果值没有像abs(2.0)中那样通过转换而更改,也不要发出警告。可以使用-Wno符号转换禁用有关有符号整数和无符号整数之间转换的警告。

对于C++,还要警告用户定义转换的重载解析混淆;以及从不使用类型转换运算符的转换:转换为void、相同类型、基类或对它们的引用。在C++中,除非显式启用-Wsign转换,否则默认情况下会禁用有关有符号整数和无符号整数之间转换的警告。