IT이야기

C에서 서명되지 않은 문자를 인쇄하는 방법

cyworld 2021. 10. 5. 21:21
반응형

C에서 서명되지 않은 문자를 인쇄하는 방법은 무엇입니까?


char을 양수 값으로 인쇄하려고합니다.

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

하지만 나는 얻는다 :

4294967252

어떻게 212출력에 들어갈 수 있습니까?


다음 ch과 같이 선언하십시오 .

unsigned char ch = 212 ;

그리고 당신의 printf가 작동할 것입니다.


이것은 이 경우 char유형이 시스템에 서명되어 있기 때문입니다 * . 이런 일이 발생하면 데이터는 가변 개수의 인수를 사용하여 함수에 데이터를 전달하는 동안 기본 변환 중에 부호 확장됩니다. 212는 0x80보다 크므로 음수로 처리되고 %u숫자를 큰 양수로 해석합니다.

212 = 0xD4

부호 확장된 경우 FFs가 번호 앞에 추가되므로 다음과 같이 됩니다.

0xFFFFFFD4 = 4294967252

인쇄되는 숫자입니다.

이 동작은 구현에 따라 다릅니다. C99 사양에 따르면 모든 char유형은 (signed) 로 승격됩니다 int. 왜냐하면 inta char, signed 또는 unsigned 의 모든 값을 나타낼 수 있기 때문입니다 .

6.1.1.2: an int이 원래 유형의 모든 값을 나타낼 수 있는 경우 값은 로 변환됩니다 int. 그렇지 않으면 로 변환됩니다 unsigned int.

그 결과 int형식 지정자 에 전달 %u되며 unsigned int.

프로그램에서 정의되지 않은 동작을 방지하려면 다음과 같이 명시적 유형 캐스트를 추가하십시오.

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


* 일반적으로 표준의 서명 여부 char는 구현 달려 있습니다. 자세한 내용은 이 질문 을 참조하세요.


이 코드에는 두 가지 버그가 있습니다. 첫째, signed 가 있는 대부분의 C 구현에서는 212 가 8비트 signed 에 맞지 않기 때문에 char오버플로 char ch = 212가 발생 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는 212가 아닌 -44(212-128-128)를 저장합니다. 따라서 음수를 부호 없는 것으로 인쇄하려고 하면 (unsigned int의 MAX 값)-abs(number) 가 표시되며 이 경우에는 4294967252입니다.

따라서 212를 ch에 그대로 저장하려면 ch를 다음과 같이 선언하는 것뿐입니다.

unsigned char ch;

이제 ch의 범위는 0에서 255까지입니다.


어떤 이유로든 선언을 변경할 수 없는 경우 다음을 수행할 수 있습니다.

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

char는 기본적으로 signed선언 되어 있기 때문에 변수의 범위는 다음과 같습니다.

-127 ~ +127>

당신의 가치는 넘쳐흐릅니다. 원하는 값을 얻으려면 unsigned수정자를 선언해야 합니다 . 수정자의 ( unsigned) 범위는 다음과 같습니다.

 0 to 255

모든 데이터 유형의 범위를 얻으려면 프로세스 2^bit예제를 따르십시오 . char범위를 얻으려면 8비트 길이 2 ^(power) 8입니다.

ReferenceURL : https://stackoverflow.com/questions/15736497/how-to-print-an-unsigned-char-in-c

반응형