sizeof(int) on x64?

49

在我的C#.NET项目中执行sizeof(int)时,返回值为4。我将项目类型设置为x64,为什么它显示4而不是8?这是因为我正在运行托管代码吗?


3
非托管代码在大小决策上与.NET相同。在普通的C++中,sizeof(int)也是4。可以把x64看作32位架构的扩展。默认仍然是32位,只是你还可以处理64位数据。 - jalf
1
更准确地说,我们已经有处理64位数据的能力了,但由于本地支持,x64 CPU可以更快地完成它。 - Mr. TA
2
为什么这个被关闭了?虽然从技术上讲它们是相同的,但另一个问题是关于Java的,而这个问题是关于.NET / C#的。 - Christian.K
7个回答

53
关键字intSystem.Int32的别名,即使在64位计算机上仍需要4个字节。

在 CPU 字边界上的对齐怎么处理?即使在 x64 上,一个单独的 Byte 也可能是 64 位宽。 - Dai

45

多种64位数据模型;微软在.NET中使用 LP64:即long和指针都是64位(尽管C风格的指针只能在C#中的unsafe上下文或作为IntPtr值使用,不能进行指针运算)。与此相反的是ILP64,其中int也是64位。

因此,在所有平台上,int是32位,long是64位;这可以从底层类型名称System.Int32System.Int64中看出。


9
你应该编辑你的答案,因为它是被接受的,以使其完全正确。删除你说“虽然.NET中不存在传统的C风格指针”的部分,并详细说明System.IntPtr依赖于体系结构。 - Fernando N.
2
你可以在C#中使用“C-style”指针,只需要在不安全的上下文中完成。就像“fnieto”所说,你需要注意IntPtr依赖于平台,在x86中,“sizeof(IntPtr)==4”,而在x64中,“sizeof(IntPtr)==8”。 - zezba9000

28

int在.NET语言中表示Int32。这样做是为了兼容32位和64位体系结构。

下面是C#中所有类型与它们在.NET中的映射表(table of all the types)


19

Int32在x86和x64上都是4字节。无论哪种情况,Int64都是8字节。C#中的int类型只是System.Int32的别名,在两个运行时环境下都相同。唯一会根据运行时环境而变化的类型是IntPtr

    unsafe
    {
        var size = sizeof(IntPtr); // 4 on x86 bit machines. 8 on x64
    }

5
或者您可以检查IntPtr.Size,它不需要使用unsafe代码。 - Jim Mischel
1
需要注意的是:UIntPtr不符合CLS标准。 - Andrew Hare

14
你可能会想到一个 int 指针或者 System.IntPtr。在 x64 上它将会是 8 字节,在 x86 上则是 4 字节。指针的大小表明您的内存具有 64 位地址。(在 x64 上,System.IntPtr.Size == 8)。 int 的含义无论在 x86 还是 x64 上都是 4 字节。也就是说,一个 int 总是对应于 System.Int32

6

记住,int只是编译器对基本类型Int32的别名。因此,在64位平台上,int仅有32位应该是显而易见的。


2
int i;
int size = BitConverter.GetBytes(i).GetLength(0);

Fiddle示例


3
这个问题是3年前提出的,已经有了一个被接受的答案。看看你能否回答那些还没有被接受的最新问题。 - mcknz

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