如果这个问题已在其他地方得到解答,我很抱歉,但我已经搜索过,还没有找到答案......
编译下面的代码时,我收到以下警告:
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>
此外,最后的测试,'一个++;'没有产生警告,我不知道为什么。
我仍然习惯于在这里提问,所以如果这个问题很简单或不清楚,请原谅我。谢谢!
答案 0 :(得分:1)
C ++11§5.17/ 7:
<强>” 强>
E1
op= E2
形式的表达式的行为等同于E1 = E1
opE2
,但{ {1}}是 仅评估一次
这意味着例如
E1
被评估为
one += list.at(0);
除了one = one + list.at(0);
仅评估一次。
在expresseion one
中,两个操作数首先被C ++11§5/ 9提升为one + list.at(0)
,通常的算术转换规则。
简而言之,C ++二进制算术运算符不处理范围可能小于int
的类型的操作数。操作数得到提升。然后对于最终分配,有(逻辑)转换回来。