小整数的字面量后缀

3

当我需要在长整型数值中使用小数时,我很少会自动添加特殊的后缀。例如,我会这样写:

for (uint div = 0; div < 100; div += 2)
{
}

替代

for (uint div = 0U; div < 100U; div += 2U)
{
}

仅仅出于好奇,编译器是否会对这两个示例进行不同的处理?如果会有优化吗?整数是原始类型,所以不会进行任何强制转换,对吗?


2
生成的 IL 代码是相同的。 - keenthinker
3
这是一种扩展转换,意味着不会出现数据丢失,因此编译器可以自动处理它。这两个代码示例是相同的。即使有强制类型转换,也没有成本,因为这些都是文字常量。所有强制类型转换在编译时完成。 - Cody Gray
@CodyGray,你应该把你的评论变成一个答案。 - Black Frog
1个回答

2

这两个代码示例是相同的。

这是一种扩展转换,意味着它不可能导致数据丢失,因此编译器可以自动处理它。所有扩展转换都是隐式转换。您可以在.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)
{
}

但不是你应该编写的东西,因为无意义的强制转换会增加不必要的混乱,使代码的含义变得难以理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接