在C#中,int必须是正数,负数还是零?

时间:2017-08-24 14:30:09

标签: c# int language-lawyer

TL; DR;

C#语言是否确保int必须包含一个且仅有一个以下属性?

  1. 严格大于0
  2. 严格低于0
  3. 等于0
  4. 准确地说,一个例子,这个断言是否保证永不失败?

    public void CheckFacts(int n) 
    {
        int trueFacts = 0;
    
        if (n > 0) trueFacts += 1;
        if (n == 0) trueFacts += 1;
        if (n < 0) trueFacts += 1;
    
        Assert.AreEqual(trueFacts, 1); 
    }
    

    后续问题:如果是,对于各种整数类型是否也是如此? (uint,long,ulong,sbyte,byte,short,ushort,...)

    对于那些可能认为这个问题有点偏离的人,不要忘记计算机数字可能会令人惊讶。

    例如,double必须是正,负或零的情况。它可以是NaN ,它可以是+0.0-0.0,3 值会导致上述断言失败。

    编辑:

    有人说这句话我花时间写这个问题,但不是一分钟看规格。我实际上花了很多时间阅读:https://msdn.microsoft.com/fr-fr/library/system.int32(v=vs.110).aspx,因为int应该是System.Int32的别名。老实说,我不确定我的问题是否明确。另外,我彻底搜索了关于SO的问题,因为我认为有人一定是在问这个问题。对不起,如果这个问题对某些人来说显而易见,那不适合我。

1 个答案:

答案 0 :(得分:9)

是的,你是对的。

C#中的int是2的补码积分类型,没有未使用的位。每个位模式都与唯一的整数值相关联。没有空间,如无限,“不是数字”,&amp; c。 (该唯一性也适用于uintlongulongsbytebyteshortushort和&amp;角)

为避免疑义,没有签名零,这是有符号幅度和1的补码方案的属性。

另请注意,对于IEEE754浮点double,您的代码使用带符号的负零,因为0.0定义为等于{{1} },-0.00.0 > -0.0。你在false上失败是对的。

参考:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/int