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

两个“uint”的区别

  •  12
  • Llyle  · 技术社区  · 17 年前

    当您试图在C#.NET中声明一个值超出其值范围的无符号变量时,它会被标记为编译器错误,但如果您在运行时生成一个负值,并在运行时将其分配给该变量,则该值会自动换行。

    uint z = -1; // Will not compile
    
    uint a = 5;
    uint b = 6;
    uint c = a - b; // Will result in uint.MaxValue
    

    无符号变量在这种情况下进行包装而不是抛出异常,有什么好的理由吗?

    谢谢

    6 回复  |  直到 17 年前
        1
  •  26
  •   Jon Skeet    17 年前

    在C#中声明一个未分配的变量不会被标记为错误-尝试为变量分配一个无效值是错误的。例如,这里有一个变量在声明后没有明确赋值(假设它是本地的):

    uint z;
    

    -1对于uint的有效值不超过0.5,这就是您的示例无法编译的原因。

    int.MaxValue 返回 int.MinValue

    注意,只有当您处于未检查的上下文中时,才需要这样做-如果您在已检查的上下文中执行这些操作中的任何一个,您将得到一个异常。例如;

    class Test
    {
        static void Main()
        {
            checked
            {
                uint a = 5;
                uint b = 6;
                uint c = a - b;
            }
        }
    }
    

    OverflowException 被扔出去。如果这是整个项目所需的,则可以在项目属性中设置它(或使用 /checked+ csc .)

    编辑:值得注意的是,其他答案表明,您可以在选中的上下文中放入少量的代码,只需声明和赋值 c 甚至只是计算。这一切都很灵活。

        2
  •  7
  •   Marc Gravell    17 年前

    包装是因为D故障C#未检查。如果添加“选中”块,将检测到溢出:

        uint a = 3, b = 4;
        checked
        {
           uint c = a - b; // throws an overflow
        }
    

    至于编译器:它只需要有效的数据。

        3
  •  3
  •   Dave Cluderay    17 年前

    uint c = checked(a - b);
    
        4
  •  0
  •   Andrew Watt    17 年前

    也许值得在这里澄清一下 uint 是一个 未签名 int,不是一个 未分配 大不一样!

        5
  •  -1
  •   Robert Deml    17 年前

    Two's Complement

    简单的回答是,最高有效位用作符号。零是正的;一个是否定的。

        6
  •  -1
  •   Lonnie Best    16 年前

    推荐文章