如果我理解正确的话,int-variable以32位保存,将其限制在20亿到20亿之间。但是,如果我使用长变量,它将保存为64位,允许存储更多数字。我坐在64位系统上,但如果我以64位存储数据,我的代码是否能在32位系统上运行良好?
谢谢!
答案 0 :(得分:25)
long
值将存储在2个内存地址中。 Int64
/ long
始终为64位,Int32
/ int
始终为32位。
有一些含义(关于内存空间和性能),但最明显的可能是写入/读取操作在32位系统上不是原子的,但你不应该指望它们原子无论如何,因为c#规范没有这样的保证。
无论哪种方式,重点是:这不是你应该担心的事情 - CLR将这些东西抽象出来。使用最适合您的类型。
答案 1 :(得分:7)
在32位系统上,可以在单个机器寄存器中执行32位整数的操作。但是对64位整数的操作需要两个机器寄存器,并且比32位操作的效率要低得多。当然,大小是long
的两倍,int
占用的内存比long
多。如果您有这些类型的数组,那么如果使用int
,您将以两倍的速度使用缓存。这也可能会影响性能。
因此,如果您可以使用long
,则应该更喜欢int
。但是,如果long
提供的32位范围不足以使您的程序正确,则需要使用{{1}}。
当然,即使64位整数上的操作在32位机器上执行时效率较低,但只有剖析才会告诉您它是否真正重要。
也许最重要的是,程序员不应该故意挥霍。为什么使用64位,如果32位就足够了?
答案 2 :(得分:4)
是。两者都支持数据类型。但64位整数不是32位处理器的原生。如果使用64位类型,并且只编译64位(可以选择x64或x86(= 32位)作为目标),则编译器可能会使用特定的64位指令,从而使您的应用程序运行得更快一些。从理论上讲,实际上你可能不会注意到这一点。
权衡是该应用程序不能在32位平台上运行。反过来会有效。因此,如果您计划以两个平台为目标,则需要编译为32位,或者编译两次,每个平台一次。
对于long
类型的可用性,它并不重要。你可以随时使用它。
答案 3 :(得分:1)
你可以这样试试:
Console.WriteLine(sizeof(long));
然后将其编译为x86
而不是AnyCPU
并运行它。您也可以在64位Windows上运行32位程序 - 看看结果如何。
甚至有更大的数字类型,例如BigInteger,它们也适用于32位和64位操作系统。