문제

GNU의 C ++ 컴파일러 에서이 코드를 시도하고 있으며 그 행동을 이해할 수 없습니다.

#include <stdio.h>;

int main()
{
    int  num1 = 1000000000;
    long num2 = 1000000000;
    long long num3;
    //num3 = 100000000000;
    long long num4 = ~0;

    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
    printf("%d %ld %lld %llu", num1, num2, num3, num4);
    return 0;
}

주석은 줄을 타지 않으면 코드가 컴파일되지 않고 오류가 발생합니다.

오류 : 정수 상수는 긴 유형에 비해 너무 큽니다.

그러나 코드가 그대로 컴파일되고 실행되면 1000000000보다 훨씬 큰 값을 생성합니다.

왜요?

도움이 되었습니까?

해결책

문자 100000000000은 문자 그대로의 정수 상수를 구성하지만 값은 유형에 비해 너무 큽니다. int. 문자의 유형을 변경하려면 접미사를 사용해야합니다.

long long num3 = 100000000000LL;

접미사 LL 문자를 유형으로 만듭니다 long long. C는 왼쪽의 유형에서 이것을 결론을 내릴만큼 "스마트"가 아니며, 유형은 사용되는 컨텍스트가 아니라 문자 자체의 특성입니다.

다른 팁

노력하다:

num3 = 100000000000LL;

그리고 BTW, C ++에서 이것은 컴파일러 확장이며 표준은 긴 길이를 정의하지 않고 C99의 일부입니다.

컴파일하는 모드에 따라 다릅니다. Long Long은 C ++ 표준의 일부가 아니라 확장으로 지원되는 (일반적으로) 만 지원됩니다. 이것은 리터럴의 유형에 영향을 미칩니다. 접미사가없는 10 진수 정수 리터럴은 항상 유형 int입니다. int가 충분히 큰 경우 그렇지 않으면 숫자를 나타냅니다. 숫자가 오랫동안 너무 커지면 결과는 구현 정의됩니다 (아마도 후진 호환성을 위해 잘린 수많은 유형의 긴 int 일 것입니다). 이 경우 LL 긴 확장 (대부분의 컴파일러에서)을 활성화하려면 LL 접미사를 명시 적으로 사용해야합니다.

다음 C ++ 버전은 문자의 유형이 최소한 길이가되기를 명시 적으로 원하지 않는 한 접미사가 필요하지 않은 방식으로 공식적으로 오랫동안 지원합니다. 숫자를 길게 표현할 수없는 경우 컴파일러는 LL 접미사 없이도 자동으로 오랫동안 사용하려고합니다. 나는 이것이 C99의 행동이라고 믿는다.

당신의 코드는 여기에 잘 컴파일됩니다 (해당 라인에도 불구하고 변경해야했습니다. 변경해야했습니다.

num3 = 100000000000000000000;

경고를 시작합니다.

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