Что произойдет, если я присвою отрицательное значение беззнаковой переменной?
мне было любопытно узнать, что произойдет, если я присвою отрицательное значение беззнаковой переменной.
код будет выглядеть так.
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.