当我使用长整数的小数字时,我很少自动添加特殊后缀。 例如,我会写:
for (uint div = 0; div < 100; div += 2)
{
}
而不是
for (uint div = 0U; div < 100U; div += 2U)
{
}
出于好奇,编译器是否以不同的方式对待这两个例子?如果是这样,它会优化吗?整数是原始类型,所以没有任何演员权利?
答案 0 :(得分:2)
两个代码示例相同。
这是一个扩展转换,意味着它不可能导致数据丢失,因此编译器可以自动处理它。所有扩展转换都是隐式转换。您可以在.NET Framework here中阅读有关数据类型转换的更多信息。
以下也是一个扩大的转换,因此隐含地完成:
int value = 16;
long other = value; // the int is implicitly converted to a long
所有这些扩大的转化都是可能的,而且是隐含的:
byte => short, short, int, uint, ulong, float, double, decimal
sbyte => short, int, long, float, double, decimal
short => int, long, float, double, decimal
ushort => int, uint, long, ulong, float, double, decimal
int => long, float, double, decimal
uint => long, ulong, float, double, decimal
long => float, double, decimal
ulong => float, double, decimal
float => double
你在问题中提到了铸造。转换是显式转换(与隐式转换相反)。在这种情况下,没有转换,因为转换是隐含的。但即使有铸造,在这种情况下也没有成本,因为这些都是数字文字。所有的演员都将在编译时完成。此代码在功能上也是等效的:
for (uint div = (uint)0; div < (uint)100; div += (uint)2)
{
}
但不是你应该写的东西,因为毫无意义的演员会增加不必要的混乱,这会掩盖代码的含义。