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

使用uint vs int[closed]

c#
  •  77
  • Eloff  · 技术社区  · 14 年前

    我观察了一段时间,C程序员倾向于在任何地方使用int,很少使用uint。但我从来没有找到一个令人满意的答案,为什么。

    如果互操作性是您的目标,那么uint不应该出现在公共api中,因为不是所有CLI语言都支持无符号整数。但这并不能解释为什么int如此普遍,即使在内部类中也是如此。我怀疑这就是为什么uint在BCL中很少使用的原因。

    在C++中,如果有一个整数,它的负值没有意义,则选择一个无符号整数。

    这清楚地表明负数是不允许的或不应该的,编译器将为您做一些检查。我还怀疑在数组索引的情况下,JIT很容易放弃下限检查。

    你不应该多用点吗?为什么?

    11 回复  |  直到 9 年前
        1
  •  52
  •   Reed Copsey    14 年前

    你对原因的观察 uint

    UInt32不符合CLS,这意味着它完全不适合在公共api中使用。如果要在私有API中使用uint,这意味着要转换到其他类型——通常保持类型不变更容易、更安全。

    我还怀疑,这在C#开发中并不常见,即使C#是唯一使用的语言,主要是因为它在BCL中并不常见。一般来说,开发人员会尝试(谢天谢地)模仿他们正在构建的框架的风格——在C#的情况下,这意味着要使您的API(公共的和内部的)看起来尽可能像.NET框架。这意味着要谨慎使用uint。

        2
  •  77
  •   jjnguy    14 年前

    int 比…短 uint .

        3
  •  19
  •   Daniel A.A. Pelsmaeker    11 年前

    正常情况下 int 就够了。如果可以满足以下所有条件,则可以使用 uint :

    • 它不适用于公共API(因为
    • 你不需要负数。
    • 你可能需要额外的范围。
    • 用它来比较 < 0 ,因为这从来都不是 true .
    • 你是 用它来比较 >= 0 ,因为这从来都不是 false .

    最后一个需求经常被遗忘,并且会引入bug:

    static void Main(string[] args)
    {
        if (args.Length == 0) return;
        uint last = (uint)(args.Length - 1);
    
        // This will eventually throw an IndexOutOfRangeException:
        for (uint i = last; i >= 0; i--)
        {
            Console.WriteLine(args[i]);
        }
    }
    
        4
  •  13
  •   lornova    8 年前

    1) 坏习惯。说真的。即使在C/C++中。

    想想共同点 for 图案:

    for( int i=0; i<3; i++ )
        foo(i);
    

    这里绝对没有理由使用整数。你永远不会有负值。但几乎每个人都会这样做一个简单的循环,即使它包含(至少)两个其他“样式”错误。

    2) int

        5
  •  5
  •   JSBÕ±Õ¸Õ£Õ¹    14 年前

    我更喜欢 uint int 内景 但是扔了一个 ArgumentException 如果数字小于零,那就太傻了——用 无符号整型 !

    无符号整型 我鼓励其他人多用它。

        6
  •  1
  •   ddm    14 年前

    老实说,对于我99.9%的工作,我可以很容易地使用ushort,但是int,你知道,听起来比ushort好多了。

        7
  •  1
  •   zezba9000    14 年前

    UINT非常有用&否则说是愚蠢的。如果有人认为只是因为他们从来没有必要使用uin而没有人会这样想,那你就错了。

        8
  •  0
  •   Henri    14 年前

    我认为这只是懒惰。C#是在台式机和其他资源相对较多的机器上进行开发的固有选择。

    C程序员是懒惰的,因为一般来说有足够的资源,没有人真正优化内存使用(一般来说,当然不总是这样)。如果一个字节就足够了,很多C#程序员,包括我在内,为了简单起见就使用int。而且,很多API函数都接受int,因此它阻止了强制转换。

    我同意选择正确的数据类型是很好的做法,但我认为主要的动机是懒惰。

    最后,选择整数在数学上更为正确。数学中不存在无符号整数(只有自然数)。由于大多数程序员都有数学背景,使用整数更自然。

        9
  •  0
  •   Ed Power    14 年前

    我认为很大一部分原因是当C第一次出现时,大多数使用的例子 int 为了简洁起见。我们为不用写作而高兴 integer 就像我们对Fortran和Pascal所做的那样,在那些日子里,我们经常将它们用于数组索引和循环计数器之类的日常事务。无符号整数是需要最后一个额外位的大数的特殊情况。我认为C习惯继续发展到C和其他新语言,如Python,这是一个自然的过程。

        10
  •  0
  •   supercat    11 年前

    一些语言(例如许多版本的Pascal)认为无符号类型代表数字量;无符号类型和大小相同的有符号类型之间的运算通常会被执行,就好像操作数被提升到下一个较大的类型一样(在某些这样的语言中,最大的类型没有无符号等价物,因此这种提升总是可能的)。

    其他语言(例如C)把N位无符号类型看作是一个围绕模2^N的组。注意,从这样一个组中的一个成员中减去N并不代表数字减法,而是得到一个组成员,当N加到这个组中时,这个组成员将得到原来的值。可以说,某些包含有符号和无符号混合值的操作实际上没有意义,可能应该被禁止,但即使是对数字文字等内容的规范不严格的代码通常也能工作,而且编写的代码混合了有符号和无符号类型,尽管不严格,但确实能工作,规格不会很快改变。

    只处理有符号类型比处理有符号和无符号类型之间复杂的交互要容易得多。无符号类型在将较大的数字从较小的部分中分解出来(例如,用于序列化)或用于重新构造此类数字时非常有用,但一般来说,对于实际表示数量的事物,最好只使用有符号的数字

        11
  •  0
  •   Pieter de Vries    7 年前

    我知道这可能是一个老线程,但我想给一些澄清。


    使用int8时,其中一个位用于负数-128。
    当您使用Uint8时,您将负数赋给正数,这样您就可以使用255个正数和1字节的相同存储量。
    唯一的退步是你现在已经失去了使用负值的能力。

    在我看来,你使用这个的唯一原因是当你需要在游戏编程方面有效率的时候,你必须存储大量的非负数。 这就是为什么没有很多程序使用它。

    主要原因是存储不是一个问题,您不能灵活地将其与其他软件、插件、数据库或Api一起使用。例如,银行需要负数来存储货币等。

    我希望这能帮助别人。