Что произойдет, если я присвою отрицательное значение неподписанной переменной?
Мне было интересно узнать, что произойдет, если я присвою отрицательное значение неподписанной переменной.
Код будет выглядеть примерно так.
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