需要在32位长的机器上进行64位乘法运算

时间:2011-05-28 23:44:29

标签: 64-bit integer 32-bit multiplying

我正在开发一个32位长的小型嵌入式系统。对于一个计算,我需要输出自1970年以来的ms时间。自1970年以来,我可以在32位无符号长秒内获得时间,但我怎么能将其表示为64位否。如果我的最大int只有32位?我确定stackoverflow会有一个狡猾的答案!我正在使用Dynamic C,接近标准C.我有一些来自另一个系统的示例代码,它具有64位长的数据类型:

long long T = (long long)(SampleTime * 1000.0 + 0.5);
data.TimeLower = (unsigned int)(T & 0xffffffff);
data.TimeUpper = (unsigned short)((T >> 32) & 0xffff);

3 个答案:

答案 0 :(得分:1)

由于你只乘以1000(秒 - > millis),你可以用两个16位多变量和一个添加和一点点摆弄来做,我已经使用你的推定数据类型来存储下面的结果:

uint32_t time32 = time();
uint32_t t1 = (time32 & 0xffff) * 1000;
uint32_t t2 = ((time32 >> 16) * 1000) + (t1 >> 16);
data.TimeLower = (uint32_t) ((t2 & 0xffff) << 16) | (t1 & 0xffff);
data.TimeUpper = (uint32_t) (t2 >> 16);

答案 1 :(得分:0)

标准方法,假设您有16x16-> 32倍数可用,将两个数字分成16位高和低部分,计算四个部分乘积,并添加结果。但是,如果你没有比32x32-> 32原语更快的16x16-> 32基元,我不确定最好的方法是什么。我认为32x32-> 32乘法应该比16x16-> 32更有用,但我想不出如何使用它。

就个人而言,我希望有一个标准原语来返回NxN乘法的上半部分(32x32,当然;对于较小的机器也是16x16,对于较大的机器则是64x64)。

答案 2 :(得分:0)

如果您更具体地了解需要进行哪种计算,可能会有所帮助。使用32位操作实现的64位乘法非常慢,并且您可能会有额外的64位除法开销(转换回秒和毫秒),这甚至更慢。

在不知道你究竟需要做什么的情况下,在我看来,使用一个结构更有效,包含一个32位无符号int表示秒数,一个16位int表示该数字毫秒(“余数”)。 (如果64位对齐比保存几个字节更重要,则使用32位int作为毫秒。)