Следующий код:
unsigned int c2 = -1;
printf("c2 = %u\n", c2);
Никогда не печатает 255
. Таблица, на которую вы смотрите, ссылается на целое число без знака из 8 битов. Значение int
в C должно составлять не менее 16 бит, чтобы соответствовать стандарту C (UINT_MAX
, определенному как 2 ^ 16-1 в пункте §5.2.4.2.1, стр. 22 * 1007 * здесь ). Поэтому значение, которое вы увидите, будет гораздо большим, чем 255. В наиболее распространенных реализациях для int
используется 32 бита, и в этом случае вы увидите 4294967295 (2 ^ 32 - 1).
Вы можете проверить, сколько битов используется для любой переменной в вашей системе, выполнив sizeof(type_or_variable) * CHAR_BIT
(CHAR_BIT
определено в limits.h
и представляет количество бит на байт, что опять-таки большую часть времени 8).
Правильный код для получения 255
в качестве вывода:
unsigned char c = -1;
printf("c = %hhu\n", c);
Где указатель префикса hh
означает (от man 3 printf
) :
чч : следующее целочисленное преобразование соответствует аргументу signed char
или unsigned char
, или следующее преобразование n
соответствует указателю на signed char
аргумент.
Все остальное - это просто реализация, определенная или даже хуже undefined поведение.