2012-04-15 2 views
0

나는 두 unsigned integers을 곱 싶습니다하지만 결과는 9989990010해야 unsigned long long 변수부호 오래 오래를 arithmetics

unsigned long long M; 
unsigned int X; 
unsigned int Y; 

X = 999999; 
Y = 9990; 
M = X * Y; 

M에되고 싶어하지만, 어떤 이유로 그것은 1400055418

I되고 유지 이것에 1 주일간 고생했습니다. 나는 울기를 원했던 시점에 도달했다고 생각합니다!

+2

9989990010LL % (1 << 32) == 1400055418LL –

답변

6

XYlong long으로 설정해야합니다.

M = (unsigned long long)X * Y; 

결과 중 하나를 캐스팅하려면 그보다 더 큰 유형을 사용해야합니다.

그렇지 않으면 결과는 int이되어 오버플로됩니다. 할당시 long long으로 캐스팅되지만 너무 늦은 시간 :-)

1

unsigned long long 중 하나 이상을 전송합니다. 다른 하나는 자동으로 전송됩니다. 여기에있는 문제는 다음과 같습니다. int 값을 자른 결과 또는 자르지 않은 결과 인 long long 값을 자르는 경우 컴파일러는 어떻게 알 수 있습니까?

3

X와 Y는 모두 정수이기 때문에 X * Y 표현식의 유형은 int입니다. 곱셈이 이미 수행 된 후 숫자는 long long으로 변환됩니다. X와 Y를 길게하면 기대 한 결과를 얻을 수 있습니다.