2012-04-15 4 views
0

Я хотел бы, чтобы умножить два unsigned integers, но я хочу, чтобы результат в unsigned long long переменнойнеподписанные длинные длинные арифметика

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

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

M должен быть 9989990010 но по какой-то причине он продолжает быть 1400055418

I с этой проблемой уже неделю, и я думаю, что дошел до того, что хочу плакать!

+2

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

ответ

6

Вам необходимо наложить X и Y на номер long long.

M = (unsigned long long)X * Y; 

Достаточно, чтобы отличить один из них, результат будет основан на большем типе.

Иначе результат будет int, следовательно, переполнение. Он будет отправлен в long long по заданию, но это было бы слишком поздно :-)

1

Отправляйте хотя бы один из них в unsigned long long. Другой будет автоматически отбрасываться (повышаться). Проблема заключается в следующем: как компилятор знает, хотите ли вы усеченный результат умножения значений int или результат не усечения, long long?

3

Оба X и Y являются только ints, поэтому тип выражения X * Y является int. Число будет преобразовано в long long после того, как умножение уже выполнено. Сделайте X и Y длинными длинными, и вы получите ожидаемый результат.