整数文字是如何存储的?

时间:2015-08-30 09:22:16

标签: c# integer literals

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

2 个答案:

答案 0 :(得分:3)

  

C#中的短整数文字...

你不能声明 short 类型的文字,所以问题是iffy。在实践中,C#编译器会将其视为 int (或 long ,如果足够大)并将其转换为 byte 在没有演员表的情况下适当的。并且当这样的转换导致溢出时抱怨。

最终会在MOV或PUSH等处理器指令中进行编码,具体取决于您使用文字的方式。一个实际的例子,使用Debug> Windows> Disasssembly窗口看到它:

    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是"移动32位立即"指令,接下来的4个字节是little-endian顺序的值。否则选择因为C#编译器使用WriteLine(Int32)重载,它没有 byte short 的重载。使用相同的技术来查看特定代码会发生什么。

答案 1 :(得分:1)

您无法声明short数字文字。您只能声明类型intfloatf后缀),doubled后缀),uint({{}的数字文字1}}后缀),ulong后缀),lulong后缀)和uldecimal后缀)。

所有没有后缀的数字文字,例如我们推断m是第一种可以表示其值的类型:12intuintlong。所以 如果将 ulong放在堆栈上,那么在32位系统上需要4个字节。