繁体   English   中英

32 位 x86 上的 64 位 int 算术(来自 c )

[英]64 bit int arthimetic on 32bit x86 (from c )

有没有一种在 32 x86 机器上使用 64 位整数的快速方法(在 c(添加:和 c++)语言编译器中)?

32 位 x86 在某种程度上支持 64 位操作(旧 mmx 中可能有一些 movq 指令和其他一些命令),但是如何从 c 中使用它?

如果有人想在 32 位 x86 机器上使用 c 中的 64 位整数算法怎么办 - 如何最简单有效地做到这一点?

//编辑

现在我找到了一些候选人

    uint64_t A;
    long long a;
    int64 a;
    __int64 a;

应该使用什么? 上述算术的某些实现是否有可能比其他实现更好/更快?

要执行64位操作,可以使用int64_tuint64_t

它们在C99 stdint.h文件stdint.h定义。

是否有在32种x86机器上(在C语言编译器中)使用64位整数的快速方法?

不能保证int为64位宽; 保证至少16位宽。 如果您想要保证至少64位宽的类型,请改用long long 在这个级别上谈论优化是徒劳的。 您最好提供一个完整的解决方案,对其进行概要分析以确定解决方案中最慢的部分,然后针对代码的那部分进行优化,或者选择一种可以更快地执行该缓慢操作的算法。 注意:解决方案是指“解决实际问题的程序”。

32位x86在某种程度上支持64位操作(旧的mmx中可能有一些movq指令以及一些其他命令),但是如何从c中使用它呢?

编译器是否自动执行您提到的movq和/或mmx优化是有问题的,因为您还没有告诉我们您使用的是哪个编译器。 但是,鉴于这种优化相对于其他优化的简单性(例如,优化死代码,优化尾部调用,甚至循环展开),我猜您的编译器会自动执行。 这是在此级别谈论优化是没有结果的另一个原因。 那些编写编译器的人通常是非常优秀的程序员,对算法的敏锐理解可以编写自动机以轻松执行简单优化。

如果有人想在32位x86机器上的c语言中使用64位整数算法,该怎么办?如何最轻松,最有效地做到这一点?

您是否尝试过编译经过完全优化的测试用例,并在其机器代码中寻找movq操作? 如果我没有说服您应该对代码进行概要分析以确定该代码是否真正值得针对,请执行以下操作:编译您的解决方案(解决问题的内容,请记住...并编译为“完全优化”) ,对它进行基准测试,以便您可以衡量优化,将机器代码转换为汇编,在汇编中执行任何手动优化,然后重新编译和基准测试。 您可能会:

  1. 花一周的时间进行优化和基准测试,以发现您节省了几微秒的时间并放弃了...这将很好地表明您的编译器花了几秒钟来生成与您花费数周的代码一样好的代码来写。 保留编译器,但放弃微优化。
  2. 找到编译器无法执行的重大优化(极不可能)。 选择更理想的编译器,或者与编写您的编译器的人联系,然后向他们解释...

无论哪种方式,进步!

据我所知,在32位系统上的Assemby中有些复杂的过程,因此可能无法在32位系统上进行加速的64位乘法或除法(使用了软件例程)(这将是对它的部分回答),但是我仍然不确定100%是否正确,因此,如果我错了,请更正此错误。

正如其他人所说,编译器会自动进行很多优化。 要搞乱这些优化,您必须进入编译器设置或添加命令,但就您而言,人们已经有 50 年的时间来解决这个问题,因此除非您想编写自己的编译器,否则最好将其搁置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM