Что произойдет, если я назначу отрицательное значение переменной без знака? - PullRequest
72 голосов
/ 26 апреля 2010

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

Код будет выглядеть примерно так:

unsigned int nVal = 0;
nVal = -5;

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

Ответы [ 5 ]

60 голосов
/ 26 апреля 2010

Для официального ответа - Раздел 4.7 conv.integral

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

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

29 голосов
/ 26 апреля 2010

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

4 голосов
/ 26 апреля 2010

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

4 голосов
/ 26 апреля 2010

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

КСТАТИ
Вы можете проверить это, написав простую C ++ программу типа «hello world» и убедитесь сами

0 голосов
/ 26 апреля 2010

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

...