C#中的小整数文字(例如12
)是否像整数变量一样使用4个字节的堆栈?它需要4个字节吗?
答案 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
数字文字。您只能声明类型int
,float
(f
后缀),double
(d
后缀),uint
({{}的数字文字1}}后缀),u
(long
后缀),l
(ulong
后缀)和ul
(decimal
后缀)。
所有没有后缀的数字文字,例如我们推断m
是第一种可以表示其值的类型:12
,int
,uint
,long
。所以 如果将 ulong
放在堆栈上,那么在32位系统上需要4个字节。