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

标签 c# int language-lawyer

TL;博士;

C# 语言是否确保 int 必须具有以下属性中的一个且仅一个

  1. 严格大于0
  2. 严格小于0
  3. 等于0

更确切地说,这个断言是否保证永远不会失败?

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 的问题,因为我认为之前一定有人问过这个问题。抱歉,如果这样的问题对某些人来说似乎很明显,但对我来说却不是。

最佳答案

是的,你是对的。

C# 中的 int 是没有未使用位的 2 的补码整数类型。每个位模式都与一个唯一的整数值相关联。无穷大,“不是数字”等之类的东西没有空间。 (这种唯一性也适用于 uintlongulongsbytebyte , short, ushort, &c.)

为避免疑义,没有符号零,这是符号大小和 1 的补码方案的属性。

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

引用:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/int

关于c# - 在 C# 中,int 必须是正数、负数还是零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45864288/

相关文章:

c# - Aforge VideoCapability 列表 - 可能不完整?

c# - 单击第一项时重新填充下拉列表

c# - 不一致的辅助功能基类错误

c++ - 防止用户输入会导致整数溢出的值

C++:在函数调用中省略参数值是否有效?

c# - HTTP GET 请求和 XML 应答

c - 硬件帮助今晚到期。 Char To Int(帮助返回 Null)

c++ - 通过静态成员函数在 C++ 中初始化非常量静态成员变量

c++ - 出现在函数表达式中的变量是否通过引用获取参数但通过值 odr-used 返回?

C++标准歧义