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

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

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

unsigned int nVal = 0; nVal = -5; 

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

5 Solutions collect form web for “Что произойдет, если я присвою отрицательное значение неподписанной переменной?”

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

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

Это по существу означает, что если базовая архитектура хранится в методе, который не является дополнением двух (например, Signed Magnitude или One’s Complement), что преобразование в unsigned должно вести себя так, как если бы это было дополнением Two.

Он назначит бит-образец, представляющий -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.

Interesting Posts

Итак, каково правильное направление косой черты (/ или \) под Windows?

Ошибка: не удалось найти оболочку gradleиента в Android SDK. Возможно, вам нужно обновить Android SDK – Android

Как получить дополнительную информацию о изображениях Windows Spotlight?

Сделайте снимок экрана из командной строки в Windows

Настройка макета для Mac OS X

Повторить data.frame N раз

Какой лучший API для чтения листов Excel в java – JXL или Apache POI

Как исключить {{{…}}} в flyspell-mode и flyspell-buffer?

Входящие и исходящие вызовы Android

Как я могу получить тот же SSID для нескольких точек доступа?

Любой способ заставить панель задач Windows спрятаться (если в режиме «автоматического скрытия»)

Как создать настраиваемый TableView в JavaFx

Как настроить различные чувствительности X и Y для моей мыши в Windows 8?

Как перенести файл из одного места в другое на Java?

UITextView внутри UIScrollView с AutoLayout

Давайте будем гением компьютера.