Целочисленные арифметические предупреждения без знака

Я прошу прощения, если на этот вопрос был дан ответ где-то еще, но я искал, и еще не нашел ответа …

Я получаю следующее предупреждение при компиляции кода ниже:

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’.

Кроме того, последний тест, «один ++;» не выдает предупреждение, и я не уверен, почему.

Я все еще привыкаю задавать вопросы здесь, так что простите, если этот вопрос тривиален или неясен. Спасибо!

-1

Решение

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, Операнды повышены. И затем для окончательного назначения, есть (логическое) преобразование обратно вниз.

1

Другие решения


По вопросам рекламы [email protected]