在x64构建的应用程序中,“int”的大小是否会发生变化?

时间:2011-03-18 18:52:25

标签: c# interop pinvoke 64-bit int

  

可能重复:
  sizeof(int) on x64?

当编译为x64而不是x86时,IntPtr的大小从4变为8。

int的大小是否也会改变,还是Int32?

当使用pinvoke和处理互操作调用时,这个问题尤为重要。是否需要将所有“int”类型显式更改为声明为Int32?

5 个答案:

答案 0 :(得分:6)

没有; int始终与Int32同义。

对于P / Invoke,您需要使用IntPtr来改变位数。

答案 1 :(得分:5)

没有。 C#中的“int”始终被定义为Int32的别名,作为C#语言规范的一部分,它始终具有相同的大小。使用“int”或“Int32”将产生完全相同的IL。

答案 2 :(得分:2)

它仍然是C#中的Int32。但是,非托管C ++,int将成为64位数字。

答案 3 :(得分:1)

Windows中的数据类型

每个应用程序和每个操作系统都有一个抽象的数据模型。许多应用程序没有明确公开此数据模型,但该模型指导了应用程序代码的编写方式。在32位编程模型(称为ILP32模型)中,整数,长整数和指针数据类型的长度为32位。大多数开发人员都没有意识到这个模型。

在64位Microsoft Windows中,数据类型大小的奇偶校验假设无效。使所有数据类型长度为64位会浪费空间,因为大多数应用程序不需要增加大小。但是,应用程序确实需要指向64位数据的指针,并且它们需要能够在选定的情况下具有64位数据类型。这些考虑因素促使Windows团队选择名为LLP64(或P64)的抽象数据模型。 在LLP64数据模型中,只有指针扩展到64位;所有其他基本数据类型(整数和长整数)的长度保持为32位。

64位平台的.NET CLR使用相同的LLP64抽象数据模型。在.NET中,有一种不完整的数据类型,专门用于保存“指针”信息: IntPtr ,其大小取决于它运行的平台(例如,32位或64位)。请考虑以下代码段:

public void SizeOfIntPtr() {
Console.WriteLine( "SizeOf IntPtr is: {0}", IntPtr.Size );
}

在32位平台上运行时,您将在控制台上获得以下输出:

CopySizeOf IntPtr is: 4

在64位平台上,您将在控制台上获得以下输出:

CopySizeOf IntPtr is: 8

如果要在运行时检查是否在64位环境中运行,可以使用IntPtr.Size作为一种方法来进行此确定。

答案 4 :(得分:0)

不,x64指的是指针的大小,而不是像int这样的单个数据片段。