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

何时使用无符号值而不是有符号值?

  •  73
  • Bernard  · 技术社区  · 16 年前

    什么时候在有符号变量上使用无符号变量比较合适?在一个 for 循环?

    我听到了很多关于这方面的意见,我想看看是否有任何类似的共识。

    for (unsigned int i = 0; i < someThing.length(); i++) {  
        SomeThing var = someThing.at(i);  
        // You get the idea.  
    }
    

    我知道Java没有未签名的值,这肯定是一个明确的决定。 Sun Microsystems 部分。

    5 回复  |  直到 10 年前
        1
  •  63
  •   Haacked    16 年前

    我很高兴找到 a good conversation 在这个问题上,我以前没有认真考虑过。

    总之,有符号是一个很好的一般选择——即使你已经死了,也要确定所有的数字都是正数——如果你要对变量做算术运算的话(比如在典型的for循环情况下)。

    如果你要做屏蔽之类的按位运算,无符号开始变得更有意义。或者,如果你不顾一切地想利用符号位获得额外的正范围。

    就我个人而言,我喜欢签名,因为我不相信自己能保持一致,避免混淆这两种类型(就像文章警告的那样)。

        2
  •  9
  •   helloandre    16 年前

    在上面的例子中,当“i”总是正的并且范围越大越好时,无符号就越有用。例如,如果您使用的是“declare”语句,例如:

    #declare BIT1 (unsigned int 1)
    #declare BIT32 (unsigned int reallybignumber)
    

    尤其是当这些值永远不会改变的时候。

    但是,如果你正在做一个会计程序,人们对他们的钱不负责任,而且经常处于赤字状态,你肯定会想使用“签名”。

    我同意Saint的观点,不过一个很好的经验法则是使用签名,C实际上默认使用签名,所以你被覆盖了。

        3
  •  7
  •   Josh    16 年前

    C和C++编译器将在比较有符号和无符号类型时生成警告;在示例代码中,不能使循环变量未签名,并且编译器在没有警告的情况下生成代码(假设已打开警告)。

    很自然,您编译时会一直打开警告,对吗?

    而且,您是否考虑过使用“将警告视为错误”进行编译,以便进一步了解这一点?

    使用有符号数字的缺点是,有一种诱惑,使它们过载,例如,值0->n是菜单选择,而-1表示没有选择任何内容,而不是创建一个具有两个变量的类,一个用于指示是否选择了某个内容,另一个用于存储选择内容。在你意识到之前,你在到处测试一个否定的菜单,而编译器抱怨你想如何将菜单选择与你拥有的菜单选择数量进行比较,但这是危险的,因为它们是不同的类型。所以不要这样做。

        4
  •  7
  •   mk12    12 年前

    size_t 通常是一个很好的选择,或者 size_type 如果您使用的是STL类。

        5
  •  7
  •   Peter Mortensen user1284631    11 年前

    我认为如果你的商业案例规定负数无效,你会 希望 显示或抛出错误。

    考虑到这一点,我最近才发现在处理二进制文件中的数据并将数据存储到数据库中的项目时有无符号整数。我故意“破坏”二进制数据,结果得到的是负值而不是预期的错误。我发现即使转换了值,该值对我的业务案例也是无效的。
    我的程序没有出错,结果我把错误的数据输入了数据库。如果我用的话会更好 uint 程序失败了。