unsigned short int의 형식 지정자는 무엇입니까?


124

다음 프로그램이 있습니다

#include <stdio.h>

int main(void)
{
    unsigned short int length = 10; 

    printf("Enter length : ");
    scanf("%u", &length);

    printf("value is %u \n", length);

    return 0;
}

사용하여 컴파일 gcc filename.c하면 다음 경고가 발생합니다 ( scanf()줄에서).

warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]

나는 다음을 참조 C99 specification - 7.19.6 Formatted input/output functions길이 수정 (같이 사용할 때 올바른 형식 지정자를 이해할 수 없었다 short, long등)과을unsignedint 데이터 유형에 대해 .

이다 %u 올바른 지정은 unsigned short int? 그렇다면 위에서 언급 한 경고가 표시되는 이유는 무엇입니까?!

편집 : 대부분의 시간 동안 노력 %uh하고 있었고 여전히 경고를하고있었습니다.


2
printf("%u\n", (unsigned int)length); //당신이 읽은 C99 사양은 항상 작동합니다 sizeof(short) <= sizeof(int)(그러나 아래 질문에 대한 실제 답변은 물론 훨씬 좋습니다)
Philip

1
캐스트가 필요 없습니다. 기본 프로모션이 처리합니다.
R .. GitHub의 STOP 돕기 ICE

답변:


155

"%h"수정자를 사용해보십시오 .

scanf("%hu", &length);
        ^

ISO / IEC 9899 : 201x-7.21.6.1-7

다음 d, i, o, u, x, X 또는 n 변환 지정자가 short 또는 unsigned short에 대한 유형 포인터가 있는 인수에 적용되도록 지정합니다 .


47

의 경우 scanf%hu포인터를 전달하므로 unsigned short. 들어 printf그것이 통과하는 것은 불가능하다, unsigned short프로모션을 기본값으로 인해이 (가로 승격됩니다 int또는 unsigned int여부에 따라 int적어도 많은 가치와 같은 비트로이 unsigned short없음) 그래서 %d%u괜찮습니다. %hu하지만 원하는 경우 무료로 사용할 수 있습니다.


7

Linux 매뉴얼 페이지에서 :

h 다음 정수 변환은 short int 또는 unsigned short int 인수 또는 fol-
       lowing n 변환은 짧은 int 인수에 대한 포인터에 해당합니다.

따라서 부호없는 짧은 정수를 인쇄하려면 형식 문자열이 "%hu".


나는 그것이 자동으로 int로 승격되기 때문에 짧은 int를 "printf"하는 방법이라고 생각하지 않는다 (문자처럼).
Alexey Frunze

2
@Alex % hu / % hd in printf가 작동합니다. C99부터 만 사용할 수있는 것은 % hhu / % hhd였습니다. % h 및 % hh는 & 0xFFFF 응답을 의미합니다. 전달 된 정수의 & 0xFF.
jørgensen

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.