문장에서 1ll의 사용은 무엇입니까 long long l = (int) a * 1ll * (int) b; in C / C ++?


최상의 답변

첫 번째, 불만 : C와 C ++는 서로 다른 두 언어입니다. 아래 답변은 두 가지 모두에 적용되지만 때로는 답변이 언어마다 다릅니다. 그리고 두 언어 모두에서 c/c++ 표현식에는 정의되지 않은 동작이 있습니다.

이것은 유형 승진을 얻는 구피 방법. 세부 정보의 예는 더 명확하게 공식화되었습니다.

int a, b;

long long l = a * 1ll * b;

OP 메모에서 1lllong 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

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다