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

使用无符号基元类型

  •  7
  • jfs  · 技术社区  · 16 年前

    大多数时候,我们代表的概念永远不能小于0。例如,为了声明长度,我们写下:

    int length;
    

    这个名称很好地表达了它的用途,但是您可以为它指定负值。似乎在某些情况下,你可以用这种方式更清楚地表达你的意图:

    uint length; 
    

    我能想到的一些缺点:

    • 无符号类型(uint、ulong、ushort)不符合cls,因此不能将其与不支持此功能的其他语言一起使用。
    • .NET类大部分时间使用签名类型,因此必须强制转换

    思想?

    6 回复  |  直到 8 年前
        1
  •  5
  •   Konrad Rudolph    16 年前

    在罗马时,要像罗马人那样做。

    虽然理论上使用无符号值(如果适用)有一个优势,因为它使代码更具表现力,但这并不是用C实现的。我不知道为什么开发人员最初没有设计接口来处理 uints 并使类型CLS兼容,但现在列车已离开车站。

    由于一致性通常很重要,我建议走C路并使用 int S.

        2
  •  5
  •   Shog9    16 年前

    如果用0值递减一个有符号的数字,它将变为负数,您可以很容易地对此进行测试。如果用0值递减一个无符号数字,它就会下溢并成为该类型的最大值,这会比较难检查。

        3
  •  5
  •   Dan Herbert    16 年前

    你的第二点是最重要的。一般来说,你应该只使用 int 因为对于整数值来说,这是一个很好的“全部捕获”。我只会用 uint 如果你绝对需要数数高于 int ,但不使用额外的内存 long 需要(内存不多,所以不要太便宜):-p。

        4
  •  2
  •   Rob Bazinet    16 年前

    我认为,除非将uint与int的微妙用法写入公司的开发人员指南中,否则它会让开发人员感到困惑。

    例如,如果长度不能小于零,那么应该在业务逻辑中清楚地表示出来,以便未来的开发人员能够阅读代码并知道真正的意图。

    只有我的2美分。

        5
  •  2
  •   Eric Burnett    16 年前

    我会指出,在C中,你可以打开 /checked 检查算术溢出/下溢,这无论如何都不是一个坏主意。如果性能在关键部分很重要,您仍然可以使用 unchecked 为了避免这种情况。

    对于内部代码(即在任何与其他语言的互操作管理中都不会引用的代码),当情况允许时,我投票赞成使用无符号代码,例如 length 前面提到的变量。这和检查过的算法一起,为开发人员提供了一个新的网络,可以更早地捕获细微的错误。

    有符号与无符号辩论的另一个观点是,有些程序员使用-1这样的值来表示错误,否则它们就没有意义。我同意这样的观点,即每个变量应该只有一个目的,但是如果您(或与您一起编码的同事)喜欢用这种方式表示错误,那么让变量签名可以让您以后灵活地添加错误状态。

        6
  •  0
  •   Sander    16 年前

    你的两点很好。不过,避免这种情况的主要原因是铸造。铸造使他们难以置信的烦人使用。我曾经尝试过使用未签名的变量,但是我必须将强制转换撒在任何地方,因为框架方法都使用有符号整数。因此,无论何时调用框架方法,都必须强制转换。