避免使用无符号整数除法
Avoid signed by unsigned integer division
我在执行以下代码时遇到了这个问题:
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转换,否则默认情况下会禁用有关有符号整数和无符号整数之间转换的警告。
相关文章:
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 从 std::string 转换为 const 无符号整数
- 迭代器和无符号整数的重载 + 运算符
- C++,概念不适用于无符号整数作为结果类型?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 原子式清除无符号整数的最低非零位
- 计算机使用什么方法添加无符号整数
- boost::任何带有结构体和无符号整数
- 添加有符号和无符号整数
- 如何安全地比较两个无符号整数计数器?
- 计算 (64 位无符号整数) * (64 位无符号整数) 的商除以 2^64
- 如何将 32 位无符号整数分配给包含 32 位的位字段
- 如何将以"\0"开头的字符 * 转换为无符号整数?
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 为大无符号整数分配内存的有效方法
- 避免使用无符号整数除法