C / C ++에서 long long long long num4 =

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;
}

주석 처리 된 줄의 주석 처리를 제거하면 코드가 컴파일되지 않고 오류가 발생합니다.

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

그러나 코드가있는 그대로 컴파일되고 실행되면 10000000000보다 훨씬 큰 값이 생성됩니다.

왜?



답변

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

long long num3 = 100000000000LL;

접미사 LL는 리터럴을 유형으로 만듭니다 long long. C는 왼쪽의 유형에서 결론을 내리기에 충분히 “스마트”하지 않습니다. 유형은 사용되는 컨텍스트가 아니라 리터럴 자체의 속성입니다.


답변

시험:

num3 = 100000000000LL;

그리고 BTW, C ++에서 이것은 컴파일러 확장이며 표준은 C99의 일부인 long long을 정의하지 않습니다.


답변

컴파일하는 모드에 따라 다릅니다. long long은 C ++ 표준의 일부가 아니지만 (보통) 확장으로 만 지원됩니다. 이것은 리터럴 유형에 영향을줍니다. 접미사가없는 십진 정수 리터럴은 int가 숫자를 나타낼 만큼 충분히 크면 항상 int 유형 이고 그렇지 않으면 long입니다. 숫자가 너무 길어도 그 결과는 구현에 따라 정의됩니다 (아마도 이전 버전과의 호환성을 위해 잘린 long int 유형의 숫자 ​​일 것입니다). 이 경우 대부분의 컴파일러에서 long long 확장을 활성화하려면 LL 접미사를 명시 적으로 사용해야합니다.

다음 C ++ 버전은 리터럴의 유형이 적어도 long long이되도록 명시 적으로 원하지 않는 한 접미사가 필요하지 않은 방식으로 long long을 공식적으로 지원합니다. 숫자를 길게 표현할 수없는 경우 컴파일러는 LL 접미사 없이도 long long을 자동으로 사용하려고합니다. 나는 이것이 C99의 행동이라고 생각합니다.


답변

귀하의 코드는 여기에서 잘 컴파일됩니다 (해석이없는 경우에도.

num3 = 100000000000000000000;

경고를 받기 시작합니다.