如何正确地乘以两个长多头?
我想乘以2 ^ 32基数给出的长数。我已经想到了一个很好的算法来做到这一点,但不幸的是我被卡住了。我坚持的情况是,我如何乘以两个长的整数并在2 ^ 32的基础上表示它。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef unsigned int uint32;
typedef unsigned long long uint64;
int main(int argc, char* argv[] )
{
uint64 a = (uint64)ULONG_MAX;
printf("%llun", a);
uint64 b = (uint64)ULONG_MAX;
printf("%llun", b);
uint64 c = (uint64)(a*b);
printf("%llun", c); // prints 1. that would be to lower 32 bits of the results. the upper half is 0xFFFFFFFE
printf("%llun", ULLONG_MAX);
system("pause");
}
为什么ULLONG_MAX与ULONG_MAX相同?根据http://en.wikipedia.org/wiki/Limits.h#Member_constants,它应该是18,446,744,073,709,551,615我
从我的评论中可以看出,我想要两个uint32中的multiplikation的结果。
lowerhalf为0x1,上半部分为0xFFFFFFFE。我如何获得这些值?
(我在SO上发现了这个问题,但是对我的情况没有帮助,因为给出的答案与我的想法类似:乘以两个长的长C)
编辑:
我的系统是Windows XP 32位。我正在使用gcc 3.4.2(mingw-special)
我在运行代码时得到的输出:
4294967295
4294967295
1
4294967295
EDIT2:
printf("%in", sizeof(unsigned long));
printf("%in", sizeof(unsigned long long));
回报
4
8
编辑3:
感谢Petesh,我找到了解决方案:
printf("%lun", c & 0xFFFFFFFF);
printf("%lun", (c >> 32));
没有找到相关结果
已邀请:
2 个回复
闪票仇门韧
辟官陡板休
给出:
如你所愿,最后两个分别是
和(264-1)。 因此,可以考虑切换到更新的编译器。您可能正在使用前C99编译器。 只是出于兴趣,
和
会给你什么系统。这对解释您的问题大有帮助。 还有其他几件事需要检查,因为你的
s似乎表明数据类型本身是可以的(虽然这些可能无法解决问题 - 它们被发现有一个相当浅的网页搜索): 尝试使用
作为格式字符串而不是
。如果MinGW正在使用MSVCRT库,则可能需要真正的64位
支持。 确保您使用
进行编译。