Подтвердить что ты не робот

Как напечатать неподписанный char в C?

Я пытаюсь напечатать char как положительное значение:

char ch = 212;
printf("%u", ch);

но я получаю:

4294967252

Как я могу получить 212 на выходе?

4b9b3361

Ответ 1

Объявите свой ch как

unsigned char ch = 212 ;

И ваш printf будет работать.

Ответ 2

Это потому, что в этом случае тип 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 до реализации. Подробнее см. этот вопрос.

Ответ 3

В этом коде есть две ошибки. Во-первых, в большинстве реализаций 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);

Ответ 4

Диапазон 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.

Ответ 5

Поскольку char по умолчанию объявлен signed, это означает, что диапазон переменной

-127 до +127 >

ваше значение переполнено. Чтобы получить желаемое значение, вам нужно объявить модификатор unsigned. диапазон модификатора (unsigned):

 0 to 255

чтобы получить диапазон любого типа данных, следуйте процессу 2^bit example char имеет длину 8 бит, чтобы получить его диапазон только 2 ^(power) 8.

Ответ 6

Если вы не можете изменить объявление по любой причине, вы можете сделать:

char ch = 212;
printf("%d", (unsigned char) ch);