强制类型转换和强类型赋值之间有区别吗?

本文关键字:之间 有区别 赋值 强类型 类型转换 | 更新日期: 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在实际操作

之前被转换为long