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

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

Код будет несколько походить на это.

unsigned int nVal = 0;
nVal = -5;

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

73
задан Evan Carroll 13 July 2018 в 20:57
поделиться

5 ответов

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

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

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

60
ответ дан 24 November 2019 в 12:23
поделиться

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

0
ответ дан 24 November 2019 в 12:23
поделиться

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

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

4
ответ дан 24 November 2019 в 12:23
поделиться

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

4
ответ дан 24 November 2019 в 12:23
поделиться

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

30
ответ дан 24 November 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: