Я пытаюсь напечатать 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);