int或uint或什么

时间:2010-02-14 01:22:02

标签: c# int int32

考虑一下

        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;中的

是否相应的另一种类型?


欢迎你建议一个更好的头衔,因为这至少对我来说没有意义

由于

8 个答案:

答案 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)

  1. This is an overflow,你的号码被缠绕并且变为否定
  2. 这不是编译器的工作,因为运行时循环可能导致同样的事情
  3. 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#中,默认设置是不在溢出时抛出异常。但您可以在项目属性的某处切换该选项。