곱하기 연산?
글쓴이: 하하 / 작성시간: 월, 2005/01/03 - 2:06오후
unsigned long long int 는 8 바이트 입니다.
아래의 값은 충분히 들어 갈 수 있는 공간이죠..
근데 20억 * 60 을 하면 이상한 값이 ii 에 들어 갑니다.
그냥 계산해서 결과만을 ii에 직접 넣을땐 전혀 이상이 없습니다.
이 문제의 원인과 해결책을 제시해 주세요.. ㅠㅠ;;;
main() { unsigned long long int ii; ii = 200000000 * 60; printf("%lld\n", ii); // '*' 연산을 사용안하고 결과만을 넣었을때 ii = 12000000000; printf("%lld", ii); }
Forums:
얼마전에 읽었던 c-faq 에서 본 듯 하여 확인해 보았습니다.i
얼마전에 읽었던 c-faq 에서 본 듯 하여 확인해 보았습니다.
ii = 200000000 * 60;
이 부분을
ii = (unsigned long long int)200000000 * 60;
으로 바꿔주면 됩니다.
c에서 곱셈은 int 타입의 곱셈으로 계산된다는군요.
그래서 결과가 오버플로우되거나 잘려나갈 수 있다고 합니다.
(unsigned long long int)(200000000 * 60);
이런 식으로 써도 문제는 해결되지 않고 반드시 중간에 사용한 방법대로 해야 한다고 나와 있군요.
더 이상 없다.
오버플로우입니다. integer constant의 형을 결정하는 규칙은
오버플로우입니다. integer constant의 형을 결정하는 규칙은 좀 복잡한데
십진수의 경우 suffix가 붙지 않으면 int, long int, long long int 순서로 표현할
수 있는 형으로 결정됩니다.
200000000 * 60은 (int) * (int)로 연산 결과가 int의 표현 범위를 벗어나게
되지요. 따라서 200000000ULL로 unsigned long long 형이라는 suffix를
명시하면 됩니다.
반면에 12000000000 의 형은 위의 규칙에 따라 long long int로 결정되기
때문에 문제가 없는 것이고요.
suffix 가 아마 LL 이죠
suffix 가 아마 LL 이죠
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
좀 더 복잡하게
좀 더 복잡하게 설명해 드리기로 하죠.
ii = 200000000 * 60;
200000000 * 60이 먼저 계산되고 그 값이 ii에 저장되는데 20억과 60 모두 int형이므로 결과도 int가 되어 흘러 넘칩니다.
망한 값이 ii에 대입됩니다. (젠장!)
ii = 200000000LL * 60 // LL을 통해 long long int임을 밝혀 줌
200000000LL * 60이 먼저 계산되고 그 값이 ii에 저장되는데 20억이 long long int이므로 60도 long long int로 계산됩니다.
정상적인 결과값이 ii에 대입되며, 이 역시 long long int형이므로 흘러 넘치지 않고 잘 저장됩니다.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
댓글 달기