当我需要在长整型数值中使用小数时,我很少会自动添加特殊的后缀。例如,我会这样写:
for (uint div = 0; div < 100; div += 2)
{
}
替代
for (uint div = 0U; div < 100U; div += 2U)
{
}
仅仅出于好奇,编译器是否会对这两个示例进行不同的处理?如果会有优化吗?整数是原始类型,所以不会进行任何强制转换,对吗?
当我需要在长整型数值中使用小数时,我很少会自动添加特殊的后缀。例如,我会这样写:
for (uint div = 0; div < 100; div += 2)
{
}
替代
for (uint div = 0U; div < 100U; div += 2U)
{
}
仅仅出于好奇,编译器是否会对这两个示例进行不同的处理?如果会有优化吗?整数是原始类型,所以不会进行任何强制转换,对吗?
这两个代码示例是相同的。
这是一种扩展转换,意味着它不可能导致数据丢失,因此编译器可以自动处理它。所有扩展转换都是隐式转换。您可以在.NET Framework中这里了解更多有关数据类型转换的内容。
以下也将是扩展转换,因此会被隐式完成:
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)
{
}
但不是你应该编写的东西,因为无意义的强制转换会增加不必要的混乱,使代码的含义变得难以理解。