代码之家  ›  专栏  ›  技术社区  ›  Asad

int或uint或什么

  •  3
  • Asad  · 技术社区  · 15 年前

    考虑一下这个

            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=-2147483648到2147483647)
    • (2)为什么要打印-2147483648而不是2147483648(编译器应该 将更好的类型确定为int range 超过)
    • (3)如果它在某个地方被转换,那么为什么n.getType()将System.Int32 ?

    Eddi1: 更正:现在你将得到我得到的。(对不起)

    变量n=i+1;至

    var n=i+3;

    编辑2: 还有一件事,如果它是溢出的,为什么不引发异常?

    添加: 当溢出发生时,是否不对

    var n

    在陈述中 var n = i + 3; 相应地转到另一种类型?


    欢迎你提出一个更好的标题,因为这对……没有意义。至少我

    谢谢

    8 回复  |  直到 15 年前
        1
  •  6
  •   Mark Byers    15 年前

    更新 海报解决了他的问题。

    1)这是预期的输出,因为您在int.maxvalue中添加了3,导致溢出。在.NET中,默认情况下,这是未选中代码中的合法操作,为负值提供环绕,但如果添加 checked 阻止它将抛出的代码 OverflowException 相反。

    2)变量的类型声明为 var 在编译时而不是运行时确定。这是一条规则,添加两个int32可以得到一个int32,而不是一个uint32、一个int64或其他东西。因此,即使在运行时您可以看到结果对于Int32来说太大,它仍然必须返回Int32。

    3)未转换为其他类型。

        2
  •  3
  •   Otávio Décio    15 年前
     1)  -2147483646 is bigger than -2,147,483,648
     2) 2147483648 is out of range
     3) int is an alias for Int32
    
        3
  •  3
  •   Guffa    15 年前

    1)
    首先,变量中的值不是-2147483646,而是-2147483648。再次运行测试并检查结果。

    没有理由int不能保存值-2147483646。在-2147483648..2147483647范围内。

    2)
    编译器选择变量的数据类型作为表达式结果的类型。表达式返回一个int值,即使编译器为变量选择一个更大的数据类型,表达式仍然返回一个int,得到的值与结果相同。

    表达式中的操作溢出,而不是将结果赋给它溢出的变量。

    3)
    它不会在任何地方转换。

        4
  •  1
  •   Nick Craver    15 年前
    1. This is an overflow ,你的号码转为负数
    2. 这不是编译器的工作,因为运行时的循环会导致相同的事情
    3. int 是别名还是 System.Int32 它们在.NET中是等效的。
        5
  •  1
  •   user271664    15 年前

    这是因为位表示法

    您使用Int32,但char(8位)也是如此

    第一个位保留符号,接下来的位保留数字

    所以用7位可以表示128个数字 0111 1111

    当你试一试1299号的时候, 1000 0001 ,符号位被设置为计算机认为它的-1

        6
  •  0
  •   Yvo    15 年前

    .NET中的算术运算不会更改实际类型。
    从一个(32位)整数开始,+3不会改变这一点。

    这也是为什么在执行此操作时会得到意外的整数:

    int a = 2147483647;
    double b = a / 4;
    

    int a = 2147483647;
    var b = a / 4;
    

    关于那件事。

    编辑 以下内容:
    没有例外,因为.NET溢出了数字。
    溢出异常只会在分配操作中发生,或者如标记所解释的,当您设置条件以生成异常时。

        7
  •  0
  •   Mawg says reinstate Monica    15 年前

    通过使用十六进制符号,您可以使这对我们所有人都更容易。

    不是每个人都知道第八个梅森素数是0x7fffffff

    只是说

        8
  •  0
  •   devoured elysium    15 年前

    如果您希望抛出异常,请编写

    abc = checked(i+3)
    

    相反。这将检查是否溢出。

    此外,在C中,默认设置是不在溢出上引发异常。但您可以在项目属性的某个地方切换该选项。