Я новичок в C. Недавно я узнал о 2 Complement
и других способах представления отрицательного числа и почему 2 Complement
был наиболее подходящим.
Что я хочу спросить, например,
int a = -3;
unsigned int b = -3; //This is the interesting Part.
Теперь для преобразования типа int
В стандарте говорится:
6.3.1.3 Целочисленные и беззнаковые целые числа
Когда значение с целым типом преобразуется в другой целочисленный тип, отличный от _Bool, if значение может быть представлено новым типом, оно не изменяется.
В противном случае, если новый тип без знака, значение преобразуется путем многократного добавления или вычитая одно больше максимального значения, которое может быть представлено в новом типе пока значение не будет в диапазоне нового типа.
Первый абзац нельзя использовать, поскольку -3
не может быть представлен unsigned int
.
Поэтому параграф 2 подходит для игры, и нам нужно знать максимальное значение для unsigned int. Его можно найти как UINT_MAX в limits.h. Максимальное значение в этом случае равно 4294967295
, поэтому вычисление:
-3 + UINT_MAX + 1 = -3 + 4294967295 + 1 = 4294967293
Теперь 4294967293
в двоичном формате 11111111 11111111 11111111 11111101
и -3
в 2 форме дополнения 11111111 11111111 11111111 11111101
, поэтому они являются по существу одним и тем же представлением бит, это всегда было бы одинаково независимо от того, какое отрицательное целое я пытаюсь назначить без знака int.So не является неподписанным типом избыточным.
Теперь я знаю, что printf("%d" , b)
- это поведение undefined в соответствии со стандартом, но не то, что разумный и интуитивный способ делать что-то. Поскольку представление будет таким же, если отрицательные представлены как 2 Complement
, и это то, что мы имеем сейчас, а другие способы используются редко и, скорее всего, не будут в будущих разработках.
Итак, если бы мы могли использовать только один тип int, теперь, если int x = -1
, то %d
проверяет знаковый бит и печатает отрицательное число, если знак бит 1
и %u
всегда интерпретирует двоичную цифру ( бит), как есть. Сложение и вычитание уже решены из-за использования 2 Complement
. Так что это не более интуитивный и менее сложный способ делать что-то.