Может ли кто-нибудь объяснить мне (подробно), как умножить два объекта __int64 и проверить, подойдет ли результат в __int64.
Примечание. Не используйте подпрограммы, зависящие от компилятора или процессора.
Может ли кто-нибудь объяснить мне (подробно), как умножить два объекта __int64 и проверить, подойдет ли результат в __int64.
Примечание. Не используйте подпрограммы, зависящие от компилятора или процессора.
не предполагая, что a
и b
положительны:
__int64 a,b;
//...
__int64 tmp_result = abs(a) * abs(b) ;
if (
( a && b ) &&
(
( tmp_result < abs(a) || tmp_result < abs(b) ) ||
( tmp_result / abs(a) != abs(b)) ||
( a == TYPE_MIN && b != 1) ||
( b == TYPE_MIN && a != 1)
)
)
std::cout << "overflow";
__int64 result = a * b;
РЕДАКТИРОВАТЬ: добавление в код угловых случаев.
РЕДАКТИРОВАТЬ: На мой взгляд, достаточно ( a && a * b / a != b)
.
a = b = 1+2^33
, затем a*b = 1 + 2^34 + 2^66 = 1 + 1^34
, он переполнился, но вы этого не обнаруживаете.
- person Yakov Galka; 30.04.2011
a == 0 || b == 0
перед оператором if
.
- person rwong; 30.04.2011
( a && a * b / a != b)
то, что вы хотите.
- person Mihran Hovsepyan; 30.04.2011
@Mihran you mean just ( a && a * b / a != b) instead of everything else?
Да.
- person Mihran Hovsepyan; 30.04.2011
a
(т.е. signed char x = a * b;
if(x / a != b)
), он даст правильный результат.
- person Mihran Hovsepyan; 30.04.2011
@Mihran but then your first ver is incorrect for lhs = std::numeric_limits<__int64>::max() + 1 and rhs = -1;
@ Мы ничего не можем сделать, в этом случае lhs
становится равным MIN_VALUE
из __int64
, поэтому проблема такая же, как и выше, и будет решена таким образом.
- person Mihran Hovsepyan; 30.04.2011
TYPE_MAX + 1 == TYPE_MIN
. А для случая lhs = TYPE_MIN
rhs = -1
работают оба кода.
- person Mihran Hovsepyan; 30.04.2011
a * b
в отдельной переменной.
- person Mihran Hovsepyan; 30.04.2011
(a && a * b / a != b)
верен, по крайней мере, для двух дополнений. Я просто уменьшил проблему до 16-битной версии и перебрал все возможные комбинации ввода. Думаю, я мог бы доказать это и для других представлений чисел, подражая их поведению при переполнении. Как только я это сделаю, я дам этому ответу +1.
- person Oliver Charlesworth; 30.04.2011
__int64
сама не является специфической для Microsoft Visual Studio? - person Peter G.   schedule 30.04.2011