【问题标题】:sizeof(int) on x64?x64 上的 sizeof(int)?
【发布时间】:2010-10-13 17:03:03
【问题描述】:

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

【问题讨论】:

  • 非托管代码做出与 .NET 相同的决定。在纯 C++ 中,sizeof(int) 也是 4。将 x64 视为对 32 位体系结构的扩展。默认仍然是 32,您只是获得了处理 64 位数据的能力以及
  • @jalf 更准确地说,我们已经具备处理 64 位数据的能力,但是由于原生支持,x64 CPU 的处理速度更快。
  • 为什么关闭?虽然技术上相同,但另一个问题是关于 Java,这是关于 .NET / C#。

标签: c# 64-bit clr sizeof


【解决方案1】:

关键字 int 别名为 System.Int32,即使在 64 位机器上仍然需要 4 个字节。

【讨论】:

  • CPU 字边界对齐怎么样?即使是单个 Byte可能在 x64 上也是 64 位宽。
【解决方案2】:

various 64-bit data models; Microsoft 将 LP64 用于 .NET:long 和指针都是 64 位的(尽管 C 样式的指针只能在 C# 中的 unsafe 上下文中使用或作为 IntPtr 值使用不能用于指针算术)。将此与 ILP64 进行对比,其中 ints 也是 64 位。

因此,在所有平台上,int 是 32 位,long 是 64 位;您可以在基础类型名称System.Int32System.Int64 中看到这一点。

【讨论】:

  • 您应该编辑您的答案,因为它是被接受的,以使其完全正确。删除你说“虽然传统的 C 风格指针不存在 .NET”的地方,细节 System.IntPtr 取决于架构。
  • 您可以在 C# 中使用“C 风格”指针,它们只需要在不安全的上下文中完成。就像“fnieto”所说,您需要注意 IntPtr 确实取决于平台,其中 x86 中的“sizeof(IntPtr)==4”和 x64 中的“sizeof(IntPtr)==8”。
【解决方案3】:

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

这是 C# 中的 table of all the types 以及它们映射到 .NET 的内容。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 或者你可以只检查 IntPtr.Size,它不需要不安全的代码。
    • 注意事项:UIntPtr 不符合 CLS。
    【解决方案5】:

    您可能会想到int 指针或System.IntPtr。这将是 x64 上的 8 个字节和 x86 上的 4 个字节。指针的大小表明您的内存有 64 位地址。 (System.IntPtr.Size == 8 在 x64 上)

    int 的含义无论是在 x86 还是 x64 上,仍然是 4 个字节。也就是说int总是对应System.Int32

    【讨论】:

      【解决方案6】:

      记住int 只是基本类型Int32 的编译器别名。考虑到为什么int 在 64 位平台上只有 32 位应该是显而易见的。

      【讨论】:

        【解决方案7】:
        int i;
        int size = BitConverter.GetBytes(i).GetLength(0);
        

        Fiddle Sample

        【讨论】:

        • 这个问题是 3 年前提出的,并且已经有一个公认的答案。看看您是否可以为最近尚未接受答案的问题提供答案。
        猜你喜欢
        • 2012-10-31
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-14
        相关资源
        最近更新 更多