考虑一下
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)
我对以下
感到困惑
- (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
var n = i + 3;
中的是否相应的另一种类型?
欢迎你建议一个更好的头衔,因为这至少对我来说没有意义
由于
答案 0 :(得分:6)
更新:海报解决了他的问题。
1)这是预期输出,因为你向int.MaxValue添加了3,导致溢出。在.NET中,默认情况下这是一个合法的操作,在未经检查的代码中给出负值的回绕,但如果在代码周围添加checked
块,则会抛出OverflowException
。
2)使用var
声明的变量的类型在编译时而不是运行时确定。添加两个Int32s的规则是提供Int32,而不是UInt32,Int64或其他东西。因此,即使在运行时您可以看到Int32的结果太大,它仍然必须返回Int32。
3)它没有转换为其他类型。
答案 1 :(得分:3)
1) -2147483646 is bigger than -2,147,483,648
2) 2147483648 is out of range
3) int is an alias for Int32
答案 2 :(得分:3)
1)
首先,变量中的值不是-2147483646,而是-2147483648。再次运行测试并检查结果。
没有理由说int不能保持值-2147483646。它在-2147483648..2147483647范围内。
2)
编译器选择变量的数据类型作为表达式结果的类型。表达式返回一个int值,即使编译器为变量选择了更大的数据类型,表达式仍会返回一个int,并且您得到与结果相同的值。
表达式中的操作溢出,而不是将结果分配给它溢出的变量。
3)
它没有在任何地方转换。
答案 3 :(得分:1)
int
是别名或System.Int32
,它们在.Net中是等效的。答案 4 :(得分:1)
这是因为位表示
你使用Int32但是char(8位)也是如此
第一位保持符号,然后以下位保存数字
因此,对于7位,您可以表示128个数字0111 1111
当您尝试第129个1000 0001
时,符号位设置为计算机认为其为-1而不是
答案 5 :(得分:0)
.NET中的算术运算不会改变实际类型 你从(32位)整数开始,+ 3不会改变它。
这也是为什么当你这样做时会得到意想不到的整数:
int a = 2147483647;
double b = a / 4;
或
int a = 2147483647;
var b = a / 4;
就此而言。
修改强>:
没有例外,因为.NET溢出了这个数字
溢出异常仅在赋值操作时发生,或者在设置条件以生成异常时由Mark解释。
答案 6 :(得分:0)
您可以使用十六进制表示法使我们更容易。
并非所有人都知道第八个梅森素数是0x7FFFFFFF
只是说'
答案 7 :(得分:0)
如果要抛出异常,请写
abc = checked(i+3)
代替。这将检查溢出。
此外,在c#中,默认设置是不在溢出时抛出异常。但您可以在项目属性的某处切换该选项。