【问题标题】:int or uint or whatint 或 uint 或什么
【发布时间】:2010-02-14 01:22:01
【问题描述】:

考虑一下

        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 ? (整数范围 = -2,147,483,648 到 2,147,483,647)
  • (2) 为什么这个打印 -2147483648 而不是 2147483648(编译器应该 决定更好的类型为 int range 超过)
  • (3) 如果在某处转换,为什么 n.GetType() 给出 System.Int32 ?

Edit1: 进行了更正:现在您将得到我所得到的。 (对不起)

var n = i + 1;到

var n = i + 3;

Edit2:还有一件事,如果溢出,为什么不引发异常?

补充:随着溢出发生,是不是给

设置类型不对

变种

在语句var n = i + 3; 中相应地转换为另一种类型?


欢迎您提出一个更好的标题,因为这对.... 至少对我来说没有意义

谢谢

【问题讨论】:

    标签: c# int int32


    【解决方案1】:

    更新:海报修复了他的问题。

    1) 这是预期的输出,因为您将 3 添加到 int.MaxValue 导致溢出。在 .NET 中,默认情况下,这是在未经检查的代码中对负值进行环绕的合法操作,但如果您在代码周围添加 checked 块,它将改为抛出 OverflowException

    2) 用var 声明的变量的类型是在编译时而不是运行时确定的。这是一个规则,添加两个 Int32 会给出一个 Int32,而不是 UInt32、Int64 或其他东西。所以即使在运行时你可以看到结果对于 Int32 来说太大了,它仍然必须返回一个 Int32。

    3) 它没有被转换成另一种类型。

    【讨论】:

      【解决方案2】:
       1)  -2147483646 is bigger than -2,147,483,648
       2) 2147483648 is out of range
       3) int is an alias for Int32
      

      【讨论】:

        【解决方案3】:

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

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

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

        溢出的是表达式中的操作,不是将结果分配给变量时溢出。

        3)
        它没有在任何地方转换。

        【讨论】:

        • +1 是第一个将整个var 考虑在内的人,我认为这是OP 的真正问题。 var 并不意味着“找出最适合在这里使用的类型”。它的字面意思是“我懒得弄清楚你的输入是什么类型,所以为我做吧”。这并不意味着使用var 不好,但是如果你想正确使用它,你需要了解它的作用。
        【解决方案4】:
        1. This is an overflow,您的电话号码已转为负数
        2. 这不是编译器的工作,因为运行时的循环可能会导致同样的事情
        3. int 是别名或 System.Int32 它们在 .Net 中是等价的。

        【讨论】:

          【解决方案5】:

          这是因为位表示

          您使用 Int32,但同样适用于 char(8 位)

          第一位是符号,后面的位是数字

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

          当您尝试第 129 个 1000 0001 时,符号位被设置,因此计算机认为它是 -1

          【讨论】:

            【解决方案6】:

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

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

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

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

            就此而言。

            编辑
            也不例外,因为 .NET 溢出了数字。
            溢出异常只会发生在赋值操作或 Mark 解释的设置条件以生成异常时。

            【讨论】:

              【解决方案7】:

              如果你想抛出异常,写

              abc = checked(i+3)
              

              相反。这将检查溢出。

              另外,在 c# 中,默认设置是溢出时不抛出异常。但您可以在项目属性的某处切换该选项。

              【讨论】:

                【解决方案8】:

                您可以使用十六进制表示法让我们所有人都更轻松。

                不是每个人都知道eighth Mersenne prime 是 0x7FFFFFFF

                只是说说

                【讨论】:

                  猜你喜欢
                  • 2011-11-24
                  • 2012-04-20
                  • 2014-08-23
                  • 1970-01-01
                  • 2010-10-10
                  • 2011-04-13
                  • 2010-10-24
                  相关资源
                  最近更新 更多