Я пытаюсь напечатать char как положительное значение:
char ch = 212;
printf("%u", ch);
но я получаю:
4294967252
Как я могу получить 212 на выходе?
Я пытаюсь напечатать char как положительное значение:
char ch = 212;
printf("%u", ch);
но я получаю:
4294967252
Как я могу получить 212 на выходе?
Объявите свой ch как
unsigned char ch = 212 ;
И ваш printf будет работать.
Это потому, что в этом случае тип char подписан на вашей системе *. Когда это происходит, данные становятся расширенными во время конверсий по умолчанию при передаче данных функции с переменным числом аргументов. Поскольку значение 212 больше 0x80, оно считается отрицательным, %u интерпретирует число как большое положительное число:
212 = 0xD4
Когда он расширяется по значению, FF предварительно привязаны к вашему номеру, поэтому он становится
0xFFFFFFD4 = 4294967252
который является напечатанным числом.
Обратите внимание, что это поведение специфично для вашей реализации. Согласно спецификации C99, все типы char продвигаются до (подписаны) int, потому что int может представлять все значения a char, подписанные или без знака:
6.1.1.2: Если
intможет представлять все значения исходного типа, значение преобразуется в значениеint; в противном случае он преобразуется вunsigned int.
Это приводит к передаче int спецификатору формата %u, который ожидает unsigned int.
Чтобы избежать поведения undefined в вашей программе, добавьте явные типы приведения следующим образом:
unsigned char ch = (unsigned char)212;
printf("%u", (unsigned int)ch);
<ч/" > * В общем случае стандарт оставляет подпись char до реализации. Подробнее см. этот вопрос.
В этом коде есть две ошибки. Во-первых, в большинстве реализаций C с подписанным char существует переполнение в char ch = 212, потому что 212 не подходит к 8-разрядному подписанному char, а стандарт C не определяет поведение при переполнении целых чисел. Вместо этого он должен быть:
unsigned char ch = 212;
Во-вторых, в printf("%u",ch), ch будет продвигаться до int в нормальных реализациях C. Однако спецификатор %u ожидает unsigned int, а стандарт C не определяет поведение при передаче неправильного типа. Вместо этого он должен быть:
printf("%u", (unsigned) ch);
Диапазон char составляет от 127 до -128. Если вы назначили 212, ch-магазины -44 (212-128-128) не 212. Так что, если вы попытаетесь напечатать отрицательное число как unsigned, вы получите (MAX-значение unsigned int) -abs (number) который в этом случае равен 4294967252
Итак, если вы хотите сохранить 212, поскольку он находится в ch, единственное, что вы можете сделать, это объявить ch как
unsigned char ch;
теперь диапазон ch равен от 0 до 255.
Поскольку char по умолчанию объявлен signed, это означает, что диапазон переменной
-127 до +127 >
ваше значение переполнено. Чтобы получить желаемое значение, вам нужно объявить модификатор unsigned. диапазон модификатора (unsigned):
0 to 255
чтобы получить диапазон любого типа данных, следуйте процессу 2^bit example char имеет длину 8 бит, чтобы получить его диапазон только 2 ^(power) 8.
Если вы не можете изменить объявление по любой причине, вы можете сделать:
char ch = 212;
printf("%d", (unsigned char) ch);