2013-07-29 4 views
2

C 표준은 표준 출력에 기가 바이트의 공백을 생성하지 않도록 프로그램에 대한 변명을하고 있습니까? C에서 printf()의 큰 필드 너비

#include <stdio.h> 

int main() 
{ 
    // 2^64 = 18446744073709551616 
    printf("x%18446744073709551619dx\n", 42); 
    return 0; 
} 

는 맥 OS X 10.8에서 테스트 및 Linux에서, 나는 x 42x를 얻을.

C11 표준은 (7.21.6.1:4) : "선택적 최소 필드 너비. 변환 된 값의 너비가 필드 너비보다 적 으면 필드 너비에 왼쪽 (또는 왼쪽 조정 플래그가 지정되어 있으면 오른쪽)으로 공백 (기본값)으로 채 웁니다. 필드 너비는 별표 (*) 또는 음수가 아닌 10 진 정수 형식을 취합니다. "

C99의 표현은 같습니다.

필드 폭이 *으로 주어지면 해당 인수는 int (7.12.6.1:5)으로 얻어집니다. 그러나 하드 코딩 된 필드 너비가 int에 맞아야한다고는 말할 수 없습니다.

+3

글쎄, 당신의 가치는 64 비트'unsigned long long '보다 훨씬 큽니다. 세 번 더 길면 정확한 너비가됩니다. –

+3

http://www.compileonline.com/compile_c_online.php에서 "x"만 출력으로 보았습니다. –

+2

필드 폭 인코딩 제한에 대한 특정 질문은 다루지 않지만 §7.21.6.1/15 "하나의 변환으로 생성 될 수있는 문자의 수는 적어도 4095 여야합니다." 따라서 구현이 2^64 + 3을 올바르게 구문 분석하더라도 "기가 바이트"대신 출력 4094 공간을 준수합니다. – Casey

답변

2

, 그 §7.21.6.1/15 상태 "생산 될 수있는 문자의 수를주의 : 여기에

는 비슷한 질문입니다 단 하나의 전환으로 4095 이상이어야합니다. " 따라서 구현이 2^64 + 3을 올바르게 구문 분석하더라도 "기가 바이트"가 아닌 4094 개의 출력을 준수합니다.