>  기사  >  백엔드 개발  >  200020002000 * 2000이 C에서 오버플로를 유발하지만 pow(2000, 4) 또는 직접 할당이 아닌 이유는 무엇입니까?

200020002000 * 2000이 C에서 오버플로를 유발하지만 pow(2000, 4) 또는 직접 할당이 아닌 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-09 19:03:02751검색

Why Does 200020002000 * 2000 Cause Overflow in C   But Not pow(2000, 4) or Direct Assignment?

왜 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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