his130   6년 전

제가 아래 코드에서 

ans = max(ans,(long long)((i - left - 1)*height[top]));

를 

ans=max(ans,(i-left-1)*(long long)(height[top])); 

이렇게 고치니까 AC를 받더라구요.


long long 변수 * int 변수 = long long 이 되나요?

(long long) ( int 변수 * int 변수 ) =  int변수 둘 중 하나라도 int max 값을 벗어나면 오류가 발생하나요?

djm03178   6년 전

사소해 보여도 다 중간 과정을 거치는 연산들입니다. (long long)(int형 * int형)은 단계적으로 보면 int형 * int형이 먼저 계산되고 그 뒤에 long long형으로 변하는 과정인데, int형끼리의 곱은 int형의 결과를 만들어내므로 이미 오버플로가 발생한 상태입니다. 하지만 (long long)int형 * int형은 먼저 하나의 int형이 long long형으로 변환되고, 이 long long형의 값과 int형을 곱하는데 이렇게 두 피연산자의 자료형이 다를 경우 더 작은 자료형의 값이 더 큰 자료형쪽으로 자동 변환된 후에 계산됩니다. 따라서 long long형끼리 곱해서 long long형의 결과를 만들어내는 것과 같아, 오버플로가 발생하지 않습니다.

his130   6년 전

항상 친절한 설명 감사드립니다!

댓글을 작성하려면 로그인해야 합니다.