Что произойдет, если я присвою отрицательное значение беззнаковой переменной?

мне было любопытно узнать, что произойдет, если я присвою отрицательное значение беззнаковой переменной.

код будет выглядеть так.

unsigned int nVal = 0;
nVal = -5;

это не дало мне никакой ошибки компилятора. Когда я запускал программу nVal было присвоено странное значение! Может быть, какое-то значение дополнения 2 присваивается nVal?

5 ответов


для официального ответа - раздел 4.7 conv.Интеграл

" Если тип назначения без знака, результирующее значение является наименьшим целым числом без знака, конгруэнтным целому источнику (по модулю 2n здесь n - Это количество битов, используемых для представления беззнакового типа). [ Примечание: в дополнительном представлении двойки это преобразование является концептуальным, и в битовом шаблоне нет изменений (если нет усечения). - конец Примечания ]

это по существу означает, что если базовая архитектура хранит в методе, который не является дополнением двух (например, Signed Magnitude или One), что преобразование в unsigned должно вести себя так, как будто это дополнение двух.


он назначит битовый шаблон, представляющий -5 (в дополнении 2) к unsigned int. Это будет большое значение без знака. Для 32-битных ints это будет 2^32-5 или 4294967291


Он будет отображаться как положительное целое число значения max unsigned integer-4 (значение зависит от архитектуры компьютера и компилятора).

кстати
Вы можете проверить это, написав простую программу типа "hello world" на C++ и убедитесь сами


вы правы, целое число со знаком хранится в форме дополнения 2, а целое число без знака хранится в двоичное представление без знака. C (и C++) не различает между ними, поэтому значение, которое вы получаете, - это просто беззнаковое двоичное значение дополняющего двоичного представления 2.


Да, вы правы. Фактическое присвоенное значение-это что-то вроде всех битов, кроме третьего. -1-все биты (hex: 0xFFFFFFFF), -2-все биты, кроме первого и так далее. Вероятно, вы увидите шестнадцатеричное значение 0xFFFFFFFB, которое в десятичном выражении соответствует 4294967291.