2017-12-05 5 views
0

printf%dint 인수 인 예는 포맷 사양에 전달할 수있는 "길이 개질제"플래그의 시리즈를 가지고 있지만 %hhdsigned char (8 비트)의 경우이고 %lldlong long (64 비트)이고 .printf의 길이 수정 자 플래그는 무엇입니까?

나는 이것이 int보다 큰 유형에 필요한 이유는 알 수 있지만 더 작은 유형은 implicitly promoted to int입니다.

어떤 상황에서 %hhd%d으로 다른 출력을 제공합니까? 실제로는 signed char을 전달한다고 가정 할 때?

+2

나는 그것이 scanf''와 대칭을 유지하기 위해 상상. 아마도 둘 모두에 대해 동일한 형식 문자열을 허용 할 수 있습니다. – StoryTeller

답변

1

scanf으로 더 짧은 데이터를 읽으려면 길이 수정자가 필요합니다. printfscanf은 수식어를 포함하여 대부분 동일한 서식 지정 문자열을 공유하기 때문에 주로 일관성 문제가 유지됩니다.

5

프로모션으로 인해 서명이 유지됩니다. 컴파일러는 변수의 유형을 알고 있지만 printf은 그렇지 않습니다. 서명되지 않은 대화 식별자가있는 서명 된 변수를 인쇄하려고하면 변수가 다르게 처리됩니다 (즉, 부호 확장 된 F를 인쇄). 길이 수정 자 hh은 명시 적으로 부호없는 형식의 부호있는 문자를 인쇄하려고한다고 말합니다. 라이브 예 :

#include <stdio.h> 
int main(void) { 
    char* s = "\u00d1"; /* Ñ */ 
    for (char* p = s; *p; ++p) printf("%02X (%02hhX)\n", *p, *p); 
    return 0; 
} 

출력 :

FFFFFFC3 (C3) 
FFFFFF91 (91)