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;
경고를 받기 시작합니다.