C# int
型在 32 位系统及 64 位系统下分别占用几个字节?
🏷️ C#
在 C# 中,int
是 System.Int32
的别名。
So,无论在 32 位还是在 64 位系统中,int
型都只占 32 个 bit
,即 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 字节压栈;