整数文字是如何存储的?

How are integer literals stored?

C# 中的小整数文字(例如12)是否像整数变量一样使用 4 个字节的堆栈‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌?需要4个字节吗?

您不能声明 short 数字文字。您只能声明类型为 intfloat(fsuffix)、double(dsuffix)、uint(u后缀),longl后缀),ulongul后缀)和decimalm后缀)。

所有没有后缀的数字文字,例如12 被推断为第一个可以表示其值的类型:intuintlongulong。所以 if 12 被放入堆栈,在 32 位系统上需要 4 个字节。

Does a short integer literal in C# ...

您不能声明 short 类型的文字,所以这个问题是不确定的。实际上,C# 编译器会将其视为 int(或 long,如果足够大)并轻松将其转换为 byte short 在适当的情况下没有转换。并在这样的转换导致溢出时抱怨。

它最终会被编码到处理器指令中,例如 MOV 或 PUSH,具体取决于您如何使用文字。一个实际的例子,使用Debug > Windows > Disasssembly window 看看吧:

    static void Main(string[] args) {
        Console.WriteLine(12);
    }

生成:

  005B2DB0 B9 0C 00 00 00       mov         ecx,0Ch  
  005B2DB5 E8 7E 38 BE 72       call        73196638  
  005B2DBA C3                   ret  

注意 MOV 指令及其生成的指令字节。 B9是"move 32-bit immediate"指令,接下来的4个字节是小端顺序的值。否则选择是因为 C# 编译器使用了 WriteLine(Int32) 重载,它没有 byteshort 的重载。使用相同的技术来查看您的特定代码会发生什么。