Что произойдет, если я присвою отрицательное значение беззнаковой переменной?
мне было любопытно узнать, что произойдет, если я присвою отрицательное значение беззнаковой переменной.
код будет выглядеть так.
unsigned int nVal = 0;
nVal = -5;
это не дало мне никакой ошибки компилятора. Когда я запустил программу nVal было присвоено странное значение! Может быть, какое-то значение дополнения 2 присваивается nVal?
5 ответов:
для официального ответа - раздел 4.7 conv.Интеграл
" Если тип назначения без знака, то полученное значение является наименьшим целым числом без знака, конгруэнтным целому числу источника (по модулю 2n здесь
n- Это количество битов, используемых для представления беззнакового типа). [ Примечание: в дополнительном представлении двух это преобразование является концептуальным и нет никаких изменений в битовом шаблоне (если нет усечения). - Конечная нота ]это по существу означает, что если базовая архитектура хранит в методе, который не является дополнением двух (например, Signed Magnitude или One's Complement), то преобразование в unsigned должно вести себя так, как если бы это было дополнение двух.
он назначит битовый шаблон, представляющий -5 (в дополнении 2) к unsigned int. Это будет большое значение без знака. Для 32-битных ints это будет 2^32-5 или 4294967291
Он будет отображаться как положительное целое значение max unsigned integer-4 (значение зависит от архитектуры компьютера и компилятора).
кстати
Вы можете проверить это, написав простую программу типа C++ "hello world" и убедитесь сами
вы правы, целое число со знаком хранится в форме дополнения 2, а целое число без знака хранится в беззнаковое двоичное представление. C (и C++) не различает эти два, поэтому значение, которое вы получаете, является просто беззнаковым двоичным значением двоичного представления дополнения 2.
Да, вы правы. Фактическое значение присваивается что-то вроде всех битов, кроме третьего. -1-это все биты набора (hex: 0xFFFFFFFF), -2-это все биты, кроме первого и так далее. То, что вы увидите, вероятно, шестнадцатеричное значение 0xFFFFFFFB, которое в десятичном виде соответствует 4294967291.
Comments