C에서 서명되지 않은 문자를 인쇄하는 방법은 무엇입니까?
char을 양수 값으로 인쇄하려고합니다.
char ch = 212;
printf("%u", ch);
하지만 나는 얻는다 :
4294967252
어떻게 212
출력에 들어갈 수 있습니까?
다음 ch
과 같이 선언하십시오 .
unsigned char ch = 212 ;
그리고 당신의 printf가 작동할 것입니다.
이것은 이 경우 char
유형이 시스템에 서명되어 있기 때문입니다 * . 이런 일이 발생하면 데이터는 가변 개수의 인수를 사용하여 함수에 데이터를 전달하는 동안 기본 변환 중에 부호 확장됩니다. 212는 0x80보다 크므로 음수로 처리되고 %u
숫자를 큰 양수로 해석합니다.
212 = 0xD4
부호 확장된 경우 FF
s가 번호 앞에 추가되므로 다음과 같이 됩니다.
0xFFFFFFD4 = 4294967252
인쇄되는 숫자입니다.
이 동작은 구현에 따라 다릅니다. C99 사양에 따르면 모든 char
유형은 (signed) 로 승격됩니다 int
. 왜냐하면 int
a 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
'IT이야기' 카테고리의 다른 글
UNIX 도메인 STREAM과 DATAGRAM 소켓의 차이점 (0) | 2021.10.05 |
---|---|
Elasticsearch 노드 다시 시작 (0) | 2021.10.05 |
numpy 값이 true인 인덱스 가져오기 (0) | 2021.10.05 |
Pandas: 데이터 프레임에 행 추가 및 인덱스 레이블 지정 (0) | 2021.10.04 |
python 프로젝트에 모든 종속성을 설치하기 위해 requirements.txt를 사용하는 방법 (0) | 2021.10.04 |