왜 200020002000*2000이 C에서 오버플로를 유발하는지
값을 할당할 때 200020002000*2000을 long long 변수에 넣으면 오버플로가 발생합니다. 그러나 pow(2000,4)를 사용하거나 16000000000000을 long long int에 직접 할당해도 오버플로가 발생하지 않습니다.
오버플로 이유
정수 리터럴 2000 기본적으로 int 유형(일반적으로 32비트)으로 암시적으로 캐스팅됩니다. 산술 연산자는 항상 인수를 존재하는 유형 중 더 큰 유형으로 승격하지만 int보다 작지는 않습니다. 따라서 이 경우 곱셈은 int*int로 수행되어 int 결과를 생성합니다.
오버플로 대 비오버플로 시나리오
두 번째 시나리오 , pow(2000,4)가 사용되는 경우 pow 함수는 인수를 double로 승격하고 double 값을 반환합니다. 이렇게 하면 계산 중에 오버플로가 발생하지 않습니다.
16000000000000이 long long int에 직접 할당되는 세 번째 시나리오에서는 리터럴이 암시적으로 long long으로 캐스팅될 만큼 충분히 큽니다. 따라서 할당은 문제 없이 수행됩니다.
해결 방법
첫 번째 시나리오에서 오버플로를 방지하려면 LL 접미사를 사용하여 정수 리터럴을 long long으로 명시적으로 캐스팅해야 합니다.
long long n = 2000LL*2000LL*2000LL*2000LL;
위 내용은 200020002000 * 2000이 C에서 오버플로를 유발하지만 pow(2000, 4) 또는 직접 할당이 아닌 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!