>  기사  >  백엔드 개발  >  'long long int' 할당에서 정수 리터럴을 곱하면 오버플로가 발생하는 이유는 무엇입니까?

'long long int' 할당에서 정수 리터럴을 곱하면 오버플로가 발생하는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-08 08:28:01404검색

Why Does Multiplying Integer Literals in a `long long int` Assignment Lead to Overflow?

Long Long Int 할당의 오버플로: 정수 리터럴 곱셈이 실패하는 이유

제공된 코드 조각에서는 세 개의 Long Long 정수 할당이 시도됩니다.

long long int n = 2000*2000*2000*2000; // overflow
long long int n = pow(2000,4); // works
long long int n = 16000000000000; // works

세 번째 과제는 성공하는데 왜 long long int를 사용해도 첫 번째 항목이 오버플로되나요?

정수형 이해

오버플로가 발생하는 이유는 정수형의 특성에 있습니다. 기본적으로 정수 리터럴에는 int보다 작지 않고 해당 값을 나타낼 수 있는 가장 작은 유형이 할당됩니다. 주어진 경우 2000은 int이며 대부분의 시스템에서 일반적으로 32비트를 차지합니다.

곱셈 규칙

곱셈과 같은 산술 연산자는 관련된 두 가지 유형 중 더 크지만 int보다 작지는 않습니다. 예를 들어:

  • char * char은 연산자*(int,int) ->를 호출합니다. int
  • char * int는 연산자*(int,int)를 호출합니다. -> int
  • long * int는 연산자*(long,long) ->를 호출합니다. long

그러나 int * int는 여전히 연산자*(int,int) -> int.

유형 승격 및 오버플로

오버플로 할당에서 2000*2000*2000*2000은 4개의 int 값을 곱하여 결과적으로 int보다 큰 정수가 됩니다. 보유할 수 있습니다. 최종 결과가 long long int 변수에 저장됨에도 불구하고 곱셈은 int로 발생합니다.

오버플로 해결

오버플로를 방지하려면 다음을 사용할 수 있습니다. 접근 방식:

  • long long int를 나타내는 2000LL을 명시적으로 사용합니다. 리터럴.
  • pow(2000,4)를 사용하여 double로 계산을 수행한 다음 이를 long long int 변수에 할당합니다.
  • 16000000000000과 같은 큰 정수 값을 직접 할당합니다. long long int 변수에.

위 내용은 'long long int' 할당에서 정수 리터럴을 곱하면 오버플로가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.