Это означает, что char
- это 8-битная переменная, которая может содержать только 2 ^ 8 = 256 значений, поскольку объявление является char ch
, ch
- это переменная signed
, что означает, что она может хранить 127 отрицательные и положительные значения. когда вы просите превысить 127, тогда значение начинается с -128.
Думайте об этом как о некоторых аркадных играх, в которых вы переходите с одной стороны экрана на другую:
ch = 50;
-----> 50 is stored
|___________________________________|___________| since it fits
-128 0 50 127 between -127
and 128
ch = 129;
--- 129 goes over
--> 127 by 2, so
|__|____________________________________________| it 'lands' in
-128 -127 0 127 -127
НО !! Вы не должны полагаться на это, поскольку это неопределенное поведение!
В честь Лучиана Григоре вот краткое представление о том, что происходит:
A char
- это переменная, которая будет содержать 8 бит или байт. Таким образом, у нас есть 8 0 и 1 изо всех сил, чтобы представить любую ценность, которую вы хотите. Если char
является переменной signed
, она будет представлять собой положительное или отрицательное число. Вы, вероятно, читали об одном бите, представляющем знак, который является абстракцией истинного процесса; на самом деле это только одно из первых решений, реализованных в электронике. Но у такого тривиального метода была проблема, у вас было бы 2 способа представления 0 (+0 и -0):
0 0000000 -> +0 1 0000000 -> -0
^ ^
|_ sign bit 0: positive |_ sign bit 1: negative
Несоответствия гарантированы! Итак, некоторые очень умные люди придумали систему, называемую «Дополнение единичного», которая представляла бы отрицательное число как отрицание (НЕ операция) своего положительного аналога:
01010101 -> +85
10101010 -> -85
Эта система ... имела ту же проблему. 0 может быть представлено как 00000000
(+0) и 11111111
(-0). Затем пришли некоторые умные люди, которые создали дополнение к двум, которое будет содержать отрицательную часть более раннего метода, а затем добавит 1, таким образом удаляя этот надоедливый -0 и давая нам новый блестящий номер в нашем диапазоне: -128 !. Так как же теперь выглядит наш ассортимент?
00000000 +0
00000001 +1
00000010 +2
...
01111110 +126
01111111 +127
10000000 -128
10000001 -127
10000010 -126
...
11111110 -2
11111111 -1
Итак, это должно дать представление о том, что происходит, когда наш маленький процессор пытается добавить числа к нашей переменной:
0110010 50 01111111 127
+0000010 + 2 +00000010 + 2
------- -- -------- ---
0110100 52 10000001 -127
^ ^ ^
|_ 1 + 1 = 10 129 in bin _| |_ wait, what?!
Да, если вы просмотрите таблицу диапазонов выше, вы можете увидеть, что до 127 (01111111
) двоичный файл был в порядке и великолепен, ничего странного не происходило, но после того, как 8-й бит установлен в -128 (* 1043) *) интерпретируемое число больше не относится к его двоичной величине, а к представлению дополнения двух. Это означает, что двоичное представление, биты в вашей переменной, 1 и 0, сердце нашего любимого char
, содержит 129 ... его там, посмотрите на это! Но злой процессор читает, что, как ничтожно-127, переменная HAD будет signed
, подрывая весь ее положительный потенциал для вонючего сдвига через линию действительных чисел в евклидовом пространстве размерности один.