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

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

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

unsigned int nVal = 0;
nVal = -5;

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

Вот что я запускал на Objective-C iOS 4.3

unsigned long testValue = 0;

NSLog(@"The value is: %lu", testValue);
testValue -= 5;
NSLog(@"The new value is: %lu", testValue);

Выход на консоль:

The value is: 0
The new value is: 4294967291

Новое значение в Hex равно 0xFFFFFFFB

Что является 2-дополнением к -5