Skip to content

C# int 型在 32 位系统及 64 位系统下分别占用几个字节?

🏷️ C#

在 C# 中,intSystem.Int32 的别名。

So,无论在 32 位还是在 64 位系统中,int 型都只占 32bit,即 4 个字节。


做了个测试,C# 代码如下:

cs
using System;

namespace IntSample
{
    class Program
    {
        static void Main(string args)
        {
            int a = 5;
            a = 8;
            a = 128;
            a = Int32.MaxValue;
            Console.WriteLine(a);

            Int64 b = 5;
            b = 8;
            b = 128;
            b = Int32.MaxValue;
            b = (Int64)Int32.MaxValue * 2;
            b = Int64.MaxValue;
            Console.WriteLine(b);
        }
    }
}

把目标平台设置为 x86 或者 x64, 反编译的结果其实是一样的.

cs
.method /*06000001*/ private hidebysig static 
        void  Main(string args) cil managed
// SIG: 00 01 01 1D 0E
{
  .entrypoint
  // 方法在 RVA 0x2050 处开始
  // 代码大小       66 (0x42)
  .maxstack  1
  .locals /*11000001*/ init (int32 V_0,
            int64 V_1)
  IL_0000:  /* 00   |                  */ nop
  IL_0001:  /* 1B   |                  */ ldc.i4.5
  IL_0002:  /* 0A   |                  */ stloc.0
  IL_0003:  /* 1E   |                  */ ldc.i4.8
  IL_0004:  /* 0A   |                  */ stloc.0
  IL_0005:  /* 20   | 80000000         */ ldc.i4     0x80
  IL_000a:  /* 0A   |                  */ stloc.0
  IL_000b:  /* 20   | FFFFFF7F         */ ldc.i4     0x7fffffff
  IL_0010:  /* 0A   |                  */ stloc.0
  IL_0011:  /* 06   |                  */ ldloc.0
  IL_0012:  /* 28   | (0A)000011       */ call       void [mscorlib/*23000001*/]System.Console/*01000013*/::WriteLine(int32) /* 0A000011 */
  IL_0017:  /* 00   |                  */ nop
  IL_0018:  /* 1B   |                  */ ldc.i4.5
  IL_0019:  /* 6A   |                  */ conv.i8
  IL_001a:  /* 0B   |                  */ stloc.1
  IL_001b:  /* 1E   |                  */ ldc.i4.8
  IL_001c:  /* 6A   |                  */ conv.i8
  IL_001d:  /* 0B   |                  */ stloc.1
  IL_001e:  /* 20   | 80000000         */ ldc.i4     0x80
  IL_0023:  /* 6A   |                  */ conv.i8
  IL_0024:  /* 0B   |                  */ stloc.1
  IL_0025:  /* 20   | FFFFFF7F         */ ldc.i4     0x7fffffff
  IL_002a:  /* 6A   |                  */ conv.i8
  IL_002b:  /* 0B   |                  */ stloc.1
  IL_002c:  /* 1F   | FE               */ ldc.i4.s   -2
  IL_002e:  /* 6E   |                  */ conv.u8
  IL_002f:  /* 0B   |                  */ stloc.1
  IL_0030:  /* 21   | FFFFFFFFFFFFFF7F */ ldc.i8     0x7fffffffffffffff
  IL_0039:  /* 0B   |                  */ stloc.1
  IL_003a:  /* 07   |                  */ ldloc.1
  IL_003b:  /* 28   | (0A)000012       */ call       void [mscorlib/*23000001*/]System.Console/*01000013*/::WriteLine(int64) /* 0A000012 */
  IL_0040:  /* 00   |                  */ nop
  IL_0041:  /* 2A   |                  */ ret
} // end of method Program::Main

可以看到 int 型变量赋值会使用【ldc.i4】操作符,表示将 4 个字节压栈;

Int64 型则根据值的大小采取不同的方式:

1.【ldc.i4 + conv.i8】或【ldc.i4.s + conv.u8】将 4 个字节的数字压栈后, 再扩展为 8 字节;

2.【ldc.i8】直接将 8 字节压栈;