Для двух дополнительных внутренних представлений, если у вас есть целочисленное значение x
, тогда выражение
x + ~x + 1
равно 0.
Так что для этого объявления
unsigned char a = 5;
операнд выражения ~a
будет повышен до типа int.
Таким образом, у вас будет этот
~a + a + 1 = 0
, то есть
~a + 5 + 1 = 0
И как результат значение выражения ~a
~a = -5 -1 = -6
В двоичной записи это выглядит так (при условии, что тип int занимает 4 байта)
a ( = 5 ) = 00000000 00000000 00000000 00000101
~a = 11111111 11111111 11111111 11111010
a + ~a = 11111111 11111111 11111111 11111111
Последнее двоичное значение является представлением -1
в типе int.
В этом вызове
printf("%d\n",a=~a);
сначала выражение ~ a было усечено до объекта типа unsigned char dues для назначения
a=~a
То есть выражение будет иметь неотрицательное число.