정수 오버플로: 곱셈이 재앙으로 이어질 때
C에서는 잠재적인 오버플로를 피하기 위해 정수 크기와 유형을 이해하는 것이 중요합니다. 다음 코드 조각을 살펴보겠습니다.
long long int n = 2000*2000*2000*2000; // overflow long long int n = pow(2000,4); // works long long int n = 16000000000000; // works
첫 번째 줄에서는 오버플로가 발생하고 나머지 두 줄은 문제 없이 작동하는 이유는 무엇입니까?
범인은 C가 정수 리터럴과 정수 리터럴을 처리하는 방식에 있습니다. 산술 연산. 기본적으로 정수 리터럴은 해당 값을 보유할 수 있지만 int보다 작지 않은 가장 작은 유형입니다. 이 경우 2000은 int이며 일반적으로 32비트 유형입니다.
산술 연산을 수행할 때 컴파일러는 피연산자 유형을 기반으로 특정 규칙을 따릅니다. 이 시나리오에서 곱셈은 관련된 유형 중 더 큰 int를 사용하여 수행됩니다. 하지만 C는 대상을 기준으로 유형을 추론하지 않으므로 할당은 관련이 없습니다.
int의 용량을 초과하는 곱셈 결과는 int로 저장되어 오버플로가 발생합니다. 이것이 첫 번째 줄에서는 오버플로가 발생하고 다른 두 줄에서는 오버플로가 발생하지 않는 이유입니다.
이 문제를 해결하려면 접미사 LL(또는 ll)을 추가하여 첫 번째 줄에 사용된 상수 유형을 명시적으로 지정할 수 있습니다. ). 이렇게 하면 리터럴이 long long int로 처리되어 오버플로가 방지됩니다.
C에서 정수 유형과 산술 연산이 작동하는 방식을 이해함으로써 잠재적인 함정을 피하고 코드가 데이터 조작을 올바르게 처리하는지 확인할 수 있습니다.
위 내용은 C에서 정수 곱셈이 오버플로를 일으키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!