强制类型转换和强类型赋值之间有区别吗?
本文关键字:之间 有区别 赋值 强类型 类型转换 | 更新日期: 2023-09-27 17:52:36
我今天在写代码的时候碰到了这个问题。例如:
long valueCast = (long)(10 + intVariable);
long valueTyped = 10L + intVariable;
这两者之间有什么区别吗?还是它们被编译成完全相同的东西?这两者之间有什么约定吗?
所以我知道这不是一个关键问题(两者都有效)。我只是很好奇它们之间的区别是什么!
EDIT -修改代码示例,使其更接近我原来的场景。我想把问题弄清楚,所以我用常数代替了变量。没有意识到编译器会自动进行算术运算(从而改变这个问题的答案)
是的,这两者之间有很大的区别。不是针对那些特定的值,而是针对具有不同值的完全相同的表达式显示差异。
在第一个版本中,加法是用32位算术进行的,然后结果被转换成long
。
在第二个版本中,第一个操作数已经是long
,因此第二个操作数被提升为long
,然后以64位算术方式进行加法运算。
例如:
unchecked
{
long valueCast = (long)(2000000000 + 2000000000);
long valueTyped = 2000000000L + 2000000000;
Console.WriteLine(valueCast);
Console.WriteLine(valueTyped);
}
结果:-294967296
4000000000
请注意,这必须在显式未检查的上下文中完成,否则第一次添加甚至不会编译 -您将得到"CS0220:在检查模式下编译时操作溢出"的错误。
这是一个编译错误:
long valueCast = (long)(2147483647 + 2);
"在已检查模式下,操作在编译时溢出。"
long valueTyped = (2147483647L + 2);
正如Jon Skeet所说,区别在于您是在进行求和之前还是之后转换为long
。
在您的示例中,10L + 2;= ((long)10) + 2;
这与(long)(10+2)不同,因为:
(long)(10+2)操作作为int(32位)执行,然后转换为long(64位)
((long)10) + 2;操作执行为long(64位),因为10在实际操作