c++中的多语句算术
Multi-Statement Arithmetic in c++
这可能已经有人问过了,但我无法在这个论坛上找到它。在对大整数进行算术运算时,我有一个关于 C++ 中整数算术的一般性问题。
unsigned int value = 500000;
value = (value * value) % 99;
上述代码的正确值是 25,但是在 C++ 中实现时,我得到的值是 90。
我查看了反汇编,这让我对为什么返回错误值有了一些了解,反汇编如下
unsigned int value = 500000;
00D760B5 mov dword ptr [value],7A120h
value = ((value * value) % 99);
00D760BC mov eax,dword ptr [value]
00D760BF imul eax,dword ptr [value]
00D760C3 xor edx,edx
00D760C5 mov ecx,63h
00D760CA div eax,ecx
00D760CC mov dword ptr [value],edx
似乎是将其放入 32 位寄存器中,这就是返回错误结果的原因。
不过,我的问题是如何模仿语言来给我正确的答案?我确信有一种简单直接的方法可以做到这一点,但我正在画一个空白。
你正在处理的数字真的很大。其他一些语言,如 python,它们内置了以特殊方式处理非常大的数字的库,因为单个 32 位整数不能容纳那么多。 C++ 不会那样做,正如 ForceBru 所说,结果是巨大的,并且会产生溢出错误。
如果你想处理长数字,你可以在大整数的系数表示中操纵多项式,或者在网上寻找科学计算库。
您应该考虑使用更大的整数类型,例如 unsigned long
或 unsigned long long
。在我的机器上,这两个都给你八个工作字节 space,允许的最大值为 18,446,744,073,709,551,615。这足够大,足以容纳 500000^2=250,000,000,000。
但是,在我看来,这是一个糟糕的解决方案。相反,你应该使用更好的数学。遵循模块化身份应该让你做你想做的事:
(ab) mod n = [(a mod n)(b mod n)] mod n.
在你的情况下,你会写:
unsigned int value = 500000;
value = ((value%99)*(value%99))%99;
这可能已经有人问过了,但我无法在这个论坛上找到它。在对大整数进行算术运算时,我有一个关于 C++ 中整数算术的一般性问题。
unsigned int value = 500000;
value = (value * value) % 99;
上述代码的正确值是 25,但是在 C++ 中实现时,我得到的值是 90。
我查看了反汇编,这让我对为什么返回错误值有了一些了解,反汇编如下
unsigned int value = 500000;
00D760B5 mov dword ptr [value],7A120h
value = ((value * value) % 99);
00D760BC mov eax,dword ptr [value]
00D760BF imul eax,dword ptr [value]
00D760C3 xor edx,edx
00D760C5 mov ecx,63h
00D760CA div eax,ecx
00D760CC mov dword ptr [value],edx
似乎是将其放入 32 位寄存器中,这就是返回错误结果的原因。
不过,我的问题是如何模仿语言来给我正确的答案?我确信有一种简单直接的方法可以做到这一点,但我正在画一个空白。
你正在处理的数字真的很大。其他一些语言,如 python,它们内置了以特殊方式处理非常大的数字的库,因为单个 32 位整数不能容纳那么多。 C++ 不会那样做,正如 ForceBru 所说,结果是巨大的,并且会产生溢出错误。
如果你想处理长数字,你可以在大整数的系数表示中操纵多项式,或者在网上寻找科学计算库。
您应该考虑使用更大的整数类型,例如 unsigned long
或 unsigned long long
。在我的机器上,这两个都给你八个工作字节 space,允许的最大值为 18,446,744,073,709,551,615。这足够大,足以容纳 500000^2=250,000,000,000。
但是,在我看来,这是一个糟糕的解决方案。相反,你应该使用更好的数学。遵循模块化身份应该让你做你想做的事:
(ab) mod n = [(a mod n)(b mod n)] mod n.
在你的情况下,你会写:
unsigned int value = 500000;
value = ((value%99)*(value%99))%99;