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

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

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

unsigned int nVal = 0; nVal = -5; 

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

Для официального ответа – раздел 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

Маркировка classа Static в VB.NET

Синтаксис Razor обеспечивает непревзойденное преимущество в разметке пользовательского интерфейса?

Какая оптимизация предлагает const в C / C ++? (если есть)

Использование компонента Sessionful Session для отслеживания сеанса пользователя

Как загрузить локальный html-файл в UIWebView

Перегрузка конструктора в TypeScript

Как я могу округлить время до ближайших X минут?

Могу ли я контролировать локальный домен домена unix, например, tcpdump?

Оптимальная форма набора данных HDF5 для строк чтения

Можно ли использовать спред на нескольких столбцах в tidyr, подобном dcast?

Неограниченные подстановочные знаки в Java

Заполнение TreeView из базы данных

Почему я не могу «открыть окно команд здесь» внутри библиотеки?

Могу ли я изменить владельца группы в постоянной группе в Wi-Fi Direct?

IntelliJ не может запускать простое веб-приложение: невозможно подключиться к серверу ping на localhost: 1099

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