문제

사용 중 문제가 생겼습니다. printf 유형의 값을 인쇄하는 함수 unsigned long long int

나는 무엇이 잘못되었는지 전혀 모른다.저는 Windows 7 Professional 64비트에서 Dev-Cpp 4.9.9.2 및 Visual Studio 2010 Professional(C 컴파일러가 아니라는 것을 알고 있지만 어쨌든 시도해 보고 싶었습니다)을 사용하고 있습니다.표시를 위해 나는 %llu 수정자(에 따라 unsigned long long int(unsigned long long int의 형식 지정자)를 어떻게 인쇄합니까?) 하지만 I64d도 시도해 보았으나 아무런 효과가 없었습니다...


첫째, 최소값과 최대값을 인쇄하고 싶었습니다. unsigned long long int (사용 ULONG_MAX ~에서 limits.h)

printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);

보고:

부호 없는 긴 긴 정수:18446744069414584320 ~ 1580552164021 (개발-Cpp)

부호 없는 긴 긴 정수:18446744069414584320 ~ 0 (비주얼 스튜디오)


그런 다음 사용하려고했습니다. printf 두 개의 0을 인쇄하려면

printf("unsigned long long int: \n%llu to %llu \n\n", 0, 0);

보고:

부호 없는 긴 긴 정수:0~1580552164021 (개발-Cpp)

부호 없는 긴 긴 정수:0에서 0 (비주얼 스튜디오)


또한 두 가지를 시도했습니다. ULONG_MAX 가치

printf("unsigned long long int: \n%llu to %llu \n\n", ULONG_MAX, ULONG_MAX);

보고:

부호 없는 긴 긴 정수:18446744073709551615 ~ 1580552164021 (개발-Cpp)

부호 없는 긴 긴 정수:18446744073709551615 ~ 0 (비주얼 스튜디오)


왜 그렇게 행동합니까?나에게 설명해 주실 수 있나요?

도움이 되었습니까?

해결책

이것은 잘못된 것입니다:

printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);

당신은 unsigned long long 형식 지정자를 전달했지만 int 그리고 unsigned long 값.프로모션 규칙은 당신이 모든 일에 부주의할 수 있음을 의미합니다. int-크기가 작거나 더 작습니다. ~ 아니다 적용하다 long long.

캐스트 사용:

printf("unsigned long long int: \n%llu to %llu \n\n",
       0ULL, (unsigned long long) ULONG_MAX);

설명: 인수를 전달할 때 printf, 다음에 들어갈 수 있는 모든 유형 int 로 승진하다 int, 그리고 다음에 들어갈 수 있는 모든 유형 unsigned int 로 승진하다 unsigned int.부호 없는 유형을 부호 있는 형식 지정자에 전달하거나 그 반대로 전달하는 것도 괜찮습니다. 전달된 형식은 형식 지정자에 지정된 유형을 사용하여 표현할 수 있습니다.

그러니 조심해야 해요 long 그리고 long long, 하지만 당신은 엉성할 수 있습니다 int, short, 그리고 char.

대부분의 컴파일러 이러한 유형의 오류에 대해 경고하도록 설정하십시오. 오류는 컴파일 타임에 매우 쉽게 감지될 수 있기 때문입니다.GCC와 Clang은 -Wformat 그 결과 다음과 같은 경고가 발생합니다.

test.c:5: warning: format ‘%llu’ expects type ‘long long unsigned int’, but argument 2 has type ‘int’
test.c:5: warning: format ‘%llu’ expects type ‘long long unsigned int’, but argument 3 has type ‘long unsigned int’

다른 팁

당신은 통과하지 않습니다 unsigned long longs.당신은 통과하고 있습니다 int (0) 및 unsigned long (ULONG_MAX).당신은 통과해야합니다 printf() 정확히 형식 문자열에 전달하겠다고 약속한 내용입니다.

대신 이것을 시도해 보세요:

printf("unsigned long long int: \n%llu to %llu \n\n", 0ULL, (unsigned long long)ULONG_MAX);

ULONG_MAXunsigned longunsigned long long가 아님을 나타냅니다.후자의 경우 ULLONG_MAX를 사용하십시오 (Extra L 참고).

다음과 같은 printf() 호출을 변경해야합니다 :

printf("unsigned long long int: \n%llu to %llu \n\n", 0ULL, ULLONG_MAX);
printf("unsigned long long int: \n%llu to %llu \n\n", ULLONG_MAX, ULLONG_MAX);
.

이렇게하면 printf()에 대한 인수가 형식 지정자와 일치하도록합니다.

Long Long Int는 C99 표준의 유형이며 MSVC는이를 지원하지 않습니다.C99 지원 (Windows 용 MINDW와 같이)을 사용하여 컴파일러를 가져 가면 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top