考虑一下
int i = 2147483647;
var n = i + 3;
i = n;
Console.WriteLine(i); // prints -2147483646 (1)
Console.WriteLine(n); // prints -2147483646 (2)
Console.WriteLine(n.GetType()); // prints System.Int32 (3)
Run Code Online (Sandbox Code Playgroud)
我对以下很困惑
- (1)int怎么能保持值-2147483646?(int range = -2,147,483,648 to 2,147,483,647)
- (2)为什么打印-2147483648而不是2147483648(编译器应该决定更好的类型,因为int范围超出)
- (3)如果它在某处转换,为什么n.GetType()给出System.Int32?
编辑1:做出更正:现在你将得到我正在获得的东西.(对不起)
var n = i + 1; 至
var n = i + 3;
Edit2:还有一件事,如果它是溢出的,为什么不引发异常?
增加:当发生溢出时,为其设置类型是不正确的
变种
在声明var n = i + 3;中相应的另一种类型?
欢迎你建议一个更好的头衔,因为这至少对我来说没有意义
谢谢
更新:海报解决了他的问题.
1)这是预期的输出,因为你向int.MaxValue添加了3,导致溢出.在.NET中,默认情况下,这是一个合法的操作,在未经检查的代码中给出负值的回绕,但如果你checked在代码周围添加一个块,它将抛出一个OverflowException代替.
2)声明的变量类型var在编译时而不是运行时确定.添加两个Int32s的规则是提供Int32,而不是UInt32,Int64或其他东西.因此,即使在运行时您可以看到Int32的结果太大,它仍然必须返回Int32.
3)它没有转换为其他类型.