Все это связано с интерпретацией значения.
Если вы предполагаете 16-битные целые числа со знаком и без знака, то вот несколько примеров, которые не совсем верны, но демонстрируют концепцию.
0000 0000 0000 1100 целое число без знака и целое число со знаком 12
1000 0000 0000 1100 целое число со знаком -12 и большое целое число без знака.
Для целых чисел со знаком бит наслева - бит знака.0 = положительный 1 = отрицательный
Для целых чисел без знака нет знакового бита.бит левой руки, позволяет вместо этого хранить большее число.
Таким образом, причина, по которой вы не видите ожидаемого, заключается в том, что
unsigned int x = -12, принимает -12 какцелое число и сохраняет его в х.x является беззнаковым, поэтому то, что было знаковым битом, теперь является частью значения.
printf позволяет сообщать компилятору, как вы хотите, чтобы значение отображалось.
% d означает отображениеэто как если бы это был подписанный Int.% u означает отображать его так, как если бы он был беззнаковым целым.
c позволяет вам делать подобные вещи.Вы программист контролируете.
Вроде как огнестрельное оружие.Это инструмент.Вы можете использовать его правильно, чтобы справиться с определенными ситуациями, или неправильно, чтобы удалить один из ваших пальцев.
Один из возможных полезных случаев:
unsigned int allBitsOn = -1;
Это конкретное значение устанавливает все биты в 1
1111 1111 1111 1111
, которые иногда могут быть полезны.