최상의 답변
첫 번째, 불만 : C와 C ++는 서로 다른 두 언어입니다. 아래 답변은 두 가지 모두에 적용되지만 때로는 답변이 언어마다 다릅니다. 그리고 두 언어 모두에서 c/c++
표현식에는 정의되지 않은 동작이 있습니다.
이것은 유형 승진을 얻는 구피 방법. 세부 정보의 예는 더 명확하게 공식화되었습니다.
int a, b;
long long l = a * 1ll * b;
OP 메모에서 1ll
는 long long
정수 리터럴을 선언합니다.
여기 코드에 존재하면 일반적인 산술 변환 을 통해 전체 곱셈이 long long
, 특히 정수 프로모션.
표현식은 ((a * 1ll) * b)
로 구문 분석됩니다. 첫 번째 곱셈은 a
의 값을 long long
로 반환합니다. 두 번째 곱셈도 long long
로 업그레이드됩니다.
명시 적 캐스트로 동일한 효과를 얻을 수 있습니다.
int a, b;
long long l = (long long)a * b;
조금 더 많은 타이핑이지만 약간만 있습니다. 두 번째 공식은 확실히 더 명확합니다. 적어도 저에게는
다음과 같이 할 수도 있습니다.
long long l = a;
l *= b;
하지만 다시 어리석어지기 시작합니다.
왜 홍보해야하나요? 값이 충분히 크면 곱셈이 오버플로 될 수 있습니다. long long
로 승격하면 그렇게되지 않을 것임을 보장 할 수 있습니다.
32 비트 int
및 64 비트라고 가정 해 보겠습니다. 비트 long long
및 2의 보수 표현. 얻을 수있는 가장 큰 제품은 -2 ^ {31} \ times -2 ^ {31} = 2 ^ {62}입니다. 이는 표현할 수있는 가장 큰 양수 값인 2 ^ {63}-1보다 작으므로 오버플로되지 않습니다.
답변
a와 b는 int int * int-> int (모두 32 비트 정수 범위 내 ie -2147483648 int 2147483647) . “. 2147483647 * 2 = -2 및 4294967294 아님 할당 연산자는 오른쪽에서 왼쪽으로의 연관성을 갖습니다. 예 : long long l = a * b; a * b는 먼저 계산됩니다 int * int-> int if a = 2147483647 and b = 2 a * b->-2 and not 4294967294 now l = -2 -2 is convert to long long and stored in l