无符号整数算术警告

时间:2014-07-11 04:36:37

标签: c++ warnings unsigned-integer integer-arithmetic

如果这个问题已在其他地方得到解答,我很抱歉,但我已经搜索过,还没有找到答案......

编译下面的代码时,我收到以下警告:

warning: conversion to 'short unsigned int' from 'int' may alter its value

以下是代码的摘录(几个例子来说明我的问题):

std::vector<unsigned short int> list = {1}; 
unsigned short int one = 1;

one += list.at(0);                            // produces warning
one += 1;                                     // produces warning
one += static_cast<unsigned short int> 1;     // produces warning
one++;                                        // does not produce warning
除了添加之外,我还尝试过其他形式的算法。为什么编译器会抛出此警告,声称我正在从'int'转换为'unsigned short int'(特别是当我明确地将其转换为unsigned时)?看来,对于第二种情况,'one + = 1;',因为表达式的右侧是正数,编译器在将它添加到无符号变量'one'时不会有任何问题。 / p>

此外,最后的测试,'一个++;'没有产生警告,我不知道为什么。

我仍然习惯于在这里提问,所以如果这个问题很简单或不清楚,请原谅我。谢谢!

1 个答案:

答案 0 :(得分:1)

C ++11§5.17/ 7:

  

<强>”
  E1 op = E2形式的表达式的行为等同于E1 = E1 op E2,但{ {1}}是   仅评估一次

这意味着例如

E1

评估为

one += list.at(0);

除了one = one + list.at(0); 仅评估一次。

在expresseion one中,两个操作数首先被C ++11§5/ 9提升为one + list.at(0)通常的算术转换规则。

简而言之,C ++二进制算术运算符不处理范围可能小于int的类型的操作数。操作数得到提升。然后对于最终分配,有(逻辑)转换回来。