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



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



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



unsigned int nVal = 0;
nVal = -5;


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

722   5  

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

    Ничего не найдено.