避免使用无符号整数除法进行签名

时间:2013-11-18 22:33:00

标签: c++ gcc type-conversion unsigned-integer

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

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

int上没有vi.size()强制转换,输出是垃圾,因为size()返回无符号整数。

如果我没有用Google搜索向量参考,我就不会想到这一点。有没有办法避免这个陷阱?对于-Wall-pedantic,gcc似乎没有对这种划分发出任何警告。

1 个答案:

答案 0 :(得分:4)

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 docs说:

  

-Wconversion

     
    

警告可能会改变值的隐式转换。这包括实数和整数之间的转换,如x为double时的abs(x);有符号和无符号之间的转换,如无符号ui = -1;和转换为较小的类型,如sqrtf(M_PI)。不要警告显式转换,如abs((int)x)和ui =(unsigned)-1,或者如果转换没有像abs(2.0)那样改变值。可以使用-Wno-sign-conversion禁用有关有符号和无符号整数之间转换的警告。

         

对于C ++,还要警告用户定义的转换会导致过载分辨率混乱;和从不使用类型转换运算符的转换:转换为void,相同类型,基类或对它们的引用。默认情况下,在C ++中禁用有符号和无符号整数之间转换的警告,除非明确启用了-Wsign-conversion。