C / C ++에서 long long
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;
}
주석 처리 된 줄의 주석 처리를 제거하면 코드가 컴파일되지 않고 오류가 발생합니다.
오류 : 정수 상수가 긴 유형에 비해 너무 큽니다.
그러나 코드가있는 그대로 컴파일되고 실행되면 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;
경고를 받기 시작합니다.
참고 URL : https://stackoverflow.com/questions/1458923/long-long-in-cc
'program story' 카테고리의 다른 글
IRB에서 .rb 파일을 실행하는 방법은 무엇입니까? (0) | 2020.09.24 |
---|---|
git 하위 모듈을 제거하는 현재 방법은 무엇입니까? (0) | 2020.09.24 |
C #의 차별적 결합 (0) | 2020.09.24 |
Javascript 한 줄에 여러 변수를 정의하는 방법은 무엇입니까? (0) | 2020.09.24 |
Ruby each_with_index 오프셋 (0) | 2020.09.24 |