32位/64位进程中的int行为?

6

我是一个64位进程,我的int大小为8字节。

我引用的dll是编译成32位的。

这个dll有一个接受int参数的函数。

会发生什么?

我将8字节发送到一个4字节的“容器”中?


1
看一下这篇帖子。我认为这应该会对你有所帮助。 - Tomtom
IntPtr 在相关平台上会改变大小,但 int 不会。由于 C# 中直接指针使用非常少,因此在完全托管的应用程序中,平台更改通常是透明的。 - Adam Houldsworth
@RoyiNamir 不会的;在 .NET/C# 层面上,您仍将向 4 字节容器发送 4 字节。在 CPU 寄存器等“底层”方面发生的情况是实现细节。 - Marc Gravell
@RoyiNamir 不,我指的是 IntPtr 类型,根据其 Size 属性,它实际上会根据使用的 CLI 而改变大小。正如 Marc 在他的回答中所述,指针和引用变得更大(因为它们显然必须适应 64 位地址空间)。 - Adam Houldsworth
你能澄清一下你所说的“引用编译为32位”的dll是什么意思吗?这个DLL是设置了平台目标为“x86”的托管程序集,还是一个本机DLL编译为x86?这两者行为有很大的不同。例如,如果您有一个平台设置为“x64”的托管EXE,并引用一个平台设置为“x86”的托管DLL,则后者的平台将被忽略,并且它将被JIT编译为x64。 - Weeble
显示剩余3条评论
4个回答

17

在64位/C#中,int仍然是4个字节。

在C#中,int始终只是global::System.Int32的别名。

会改变的是引用大小和指针大小,但这一切都被IL抽象化了——不需要做任何改变。请注意,CLI只能是32位xor(nand?)64位。您可能需要其中一个为"Any CPU"。


实际运行时生成的进程将具有固定的32/64模式。它不能同时存在。x86和x64有单独的CLIs。相关的CLI将被加载,但是:如果一个dll严格为x86,另一个严格为x64,则它们可能无法很好地协同工作。"任何CPU"会更加友好。 - Marc Gravell
@RoyiNamir:指针本身是一种数据类型,它包含了指向另一个空间的地址,该空间存储着值。因此,指针的大小取决于系统,但在这种情况下,存储值的字段的大小仍然为4个字节。 - Tigran
@Tigran 这不是浪费吗?我的参考值是“8字节”大小,但是这个区域可以存储的最大值只能存储为“4字节”? - Royi Namir
2
@Royi:是的,但是你要如何以处理不同指针大小的方式来管理操作系统,尤其是在混合进程中,其中你可能会将只有64位数据与只有32位数据混合。如果不是不可能,那么这将变得混乱难以管理。忘掉CLR,考虑操作系统设计,因为指针大小是由操作系统定义而不是由CLR定义的。 - Tigran
@Tigran,现在我明白了。谢谢。(那就是缺失的部分)..... :) - Royi Namir
显示剩余10条评论

3
它总是映射到“System.Int32”,因此只需要4个。

3
在C#中,32位和64位程序集中的整数大小相同。 intInt32始终为32位,而longInt64始终为64位。

在64位进程中,int将具有相同的最大值,但将被视为8字节容器进行“访问”吗? - Royi Namir

1

int 在 C# 中始终为32位(4字节),但在其他一些语言如C++中不是这样。 System.IntPtr 在x86机器上为4字节,在64位操作系统上为8字节。如果您想要使用依赖于操作系统的整数类型,请使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接