Я прошу прощения, если на этот вопрос был дан ответ где-то еще, но я искал, и еще не нашел ответа …
Я получаю следующее предупреждение при компиляции кода ниже:
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
Я также пробовал другие формы арифметики, кроме сложения. Почему компилятор выдает это предупреждение, утверждая, что я конвертирую в «unsigned short int» из «int» (особенно когда я явно приводил его как unsigned)? Также может показаться, что для второго случая ‘one + = 1;’, поскольку правая часть выражения является положительным числом, у компилятора не возникнет проблем с добавлением его в переменную без знака ‘one’.
Кроме того, последний тест, «один ++;» не выдает предупреждение, и я не уверен, почему.
Я все еще привыкаю задавать вопросы здесь, так что простите, если этот вопрос тривиален или неясен. Спасибо!
C ++ 11 §5.17 / 7:
»
Поведение выражения формыE1
оп= E2
эквивалентноE1 = E1
опE2
Кроме этогоE1
является
оценивается только один раз
Это означает, что, например,
one += list.at(0);
оценивается как будто это было
one = one + list.at(0);
Кроме этого one
оценивается только один раз.
В выражении one + list.at(0)
оба операнда сначала повышаются до int
в соответствии с C ++ 11 §5 / 9 обычные арифметические преобразования править.
Короче говоря, двоичные арифметические операторы C ++ не имеют дело с операндами типов с потенциально меньшим диапазоном, чем int
, Операнды повышены. И затем для окончательного назначения, есть (логическое) преобразование обратно вниз.