整数文字是如何存储的?
How are integer literals stored?
C# 中的小整数文字(例如12
)是否像整数变量一样使用 4 个字节的堆栈?需要4个字节吗?
您不能声明 short
数字文字。您只能声明类型为 int
、float
(f
suffix)、double
(d
suffix)、uint
(u
后缀),long
(l
后缀),ulong
(ul
后缀)和decimal
(m
后缀)。
所有没有后缀的数字文字,例如12
被推断为第一个可以表示其值的类型:int
、uint
、long
、ulong
。所以 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) 重载,它没有 byte 或 short 的重载。使用相同的技术来查看您的特定代码会发生什么。
C# 中的小整数文字(例如12
)是否像整数变量一样使用 4 个字节的堆栈?需要4个字节吗?
您不能声明 short
数字文字。您只能声明类型为 int
、float
(f
suffix)、double
(d
suffix)、uint
(u
后缀),long
(l
后缀),ulong
(ul
后缀)和decimal
(m
后缀)。
所有没有后缀的数字文字,例如12
被推断为第一个可以表示其值的类型:int
、uint
、long
、ulong
。所以 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) 重载,它没有 byte 或 short 的重载。使用相同的技术来查看您的特定代码会发生什么。