부호 없는 문자를 C로 인쇄하려면 어떻게 해야 합니까?
char를 양의 값으로 인쇄하려고 합니다.
char ch = 212;
printf("%u", ch);
하지만 이해한다:
4294967252
입수 방법212
출력에 대해서요?
이 코드에는 2개의 버그가 있습니다.첫째, 대부분의 C 실장에서는 서명된char
, 에 문제가 있습니다.char ch = 212
왜냐하면 212는 8비트 서명에 맞지 않기 때문입니다.char
C 규격은 동작을 완전히 정의하지 않습니다(동작을 정의하기 위해서는 실장이 필요합니다).대신 다음과 같이 해야 합니다.
unsigned char ch = 212;
둘째, 인printf("%u",ch)
,ch
로 승진하다int
표준 C 실장에서는요.하지만, 그%u
지정자는 다음을 기대합니다.unsigned int
C 표준에서는 잘못된 유형이 전달되었을 때의 동작을 정의하지 않습니다.대신 다음과 같이 해야 합니다.
printf("%hhu", ch);
(용도)%hhu
,printf
기대하다unsigned char
통상적인 C 실장에서는 로 승격되어 있다.int
.)
왜냐하면 이 경우,char
type이 시스템에* 서명되어 있습니다.이 경우 데이터는 기본 변환 중에 부호 확장되며 변수 수를 사용하여 함수에 데이터를 전달합니다.212는 0x80보다 크므로 음수로 처리됩니다.%u
는 이 숫자를 큰 양의 숫자로 해석합니다.
212 = 0xD4
표지판이 확장되면FF
는 사용자의 번호에 프리펜드 되어 있기 때문에
0xFFFFFFD4 = 4294967252
인쇄되는 숫자입니다.
이 동작은, 실장 마다 다릅니다.C99 사양에 따라 모두char
유형이 (서명된)로 승격됩니다.int
왜냐하면int
의 모든 값을 나타낼 수 있습니다.char
, 서명 또는 서명 없음:
6.1.1.2: 만약
int
원래 유형의 모든 값을 나타낼 수 있습니다.이 값은 다음 형식으로 변환됩니다.int
; 그 이외의 경우, 이 값은 R/O/O/O로 변환됩니다.unsigned int
.
그 결과, 1차적으로int
형식 지정자에 따라%u
(이것에 의해,unsigned int
.
프로그램에서 정의되지 않은 동작을 방지하려면 다음과 같이 명시적 유형 캐스트를 추가하십시오.
unsigned char ch = (unsigned char)212;
printf("%u", (unsigned int)ch);
* In general, the standard leaves the signedness of
char
up to the implementation. See
이 문제 for more details.
선언하다ch
~하듯이
unsigned char ch = 212 ;
그리고 당신의 프린트f는 작동될 것입니다.
어떠한 이유로 선언을 변경할 수 없는 경우 다음을 수행할 수 있습니다.
char ch = 212;
printf("%d", (unsigned char) ch);
char의 범위는 127 ~ -128입니다212를 할당하면 ch에는 212가 아닌 -44(212-128-128)가 저장됩니다.따라서 음수를 부호 없음으로 인쇄하려고 하면 (MAX 값 unsigned int)-abs(number)가 표시됩니다.이 경우 4294967252 입니다.
따라서 212를 그대로 ch에 저장하려면 ch를 ch로 선언하는 것 밖에 할 수 없습니다.
unsigned char ch;
ch 의 범위는 0 ~255 입니다.
★★★★★★★★★★★★★★★★★★char
로는 「」입니다.signed
가 선언된 합니다.
- +flash >
당신의 가치는 넘쳐납니다.을 해야 .unsigned
수식자)unsigned
의는 다음과 같습니다.
0 to 255
하려면 , 의 순서에 .2^bit
»char
이며, 8비트 길이의 범위만 수 .2 ^(power) 8
.
언급URL : https://stackoverflow.com/questions/15736497/how-to-print-an-unsigned-char-in-c
'programing' 카테고리의 다른 글
약하게 타이핑된 언어에 관한 명백한 모순에 대한 해명을 요구하고 있다. (0) | 2022.08.08 |
---|---|
나중에 vue-cli를 통해 vue 웹 팩 템플릿을 쉽게 사용할 수 있습니까? (0) | 2022.08.08 |
Java 문자열이 "."로 분할됨(도트) (0) | 2022.08.03 |
Jackson을 사용하여 JSON에서 필드 이름을 변경하는 방법 (0) | 2022.08.03 |
큰 라이브러리를 사용하는 것은 본질적으로 코드를 느리게 만드는 것입니까? (0) | 2022.08.03 |