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

Bernard 74 language-agnostic types

何时在签名变量上使用无符号变量是否合适?怎么样在一个for循环?

我听到很多关于此的意见,我想看看是否有任何类似的共识.

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

我知道Java没有无符号值,这一定是Sun Microsystems的一个有说服力的决定.

saint_groceo.. 64

我很高兴能就这个问题找到一个很好的对话,因为我以前没有多想过.

总而言之,签名是一个很好的一般选择 - 即使你确定所有的数字都是正数 - 如果你要对变量进行算术运算(比如典型的for循环情况).

如果你要做像面具这样的按位,那么无符号的开始会更有意义.或者,如果你急于通过利用符号位来获得额外的正向范围.

就个人而言,我喜欢签名,因为我不相信自己保持一致,避免混合这两种类型(如文章警告).


helloandre.. 9

在上面的示例中,当'i'始终为正数且更高的范围将是有益的时,无符号将是有用的.就像你使用'declare'语句一样,例如:

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

特别是当这些值永远不会改变时.

但是,如果你正在做一个会计程序,人们对他们的钱不负责任并且经常处于亏损状态,你肯定会想要使用'签名'.

我确实同意圣人的意见,但一个好的经验法则是使用signed,C实际上是默认的,所以你被覆盖了.


Mark Harriso.. 7

size_t通常是一个很好的选择,或者size_type如果你使用的是STL课程.


Josh.. 7

当您比较有符号和无符号类型时,C和C++编译器将生成警告; 在您的示例代码中,您无法使您的循环变量无符号并让编译器生成没有警告的代码(假设已打开警告).

当然,你正在编写警告,一直向上,对吧?

而且,您是否考虑过将"将警告视为错误"进行编译以使其更进一步?

使用带符号数字的缺点是有一个让它们超载的诱惑,例如,值0-> n是菜单选择,-1表示没有选择 - 而不是创建一个有两个变量的类,一个到指示是否选择了某些内容,另一个来存储选择内容.在您知道它之前,您正在测试各地的负面消息并且编译器抱怨您希望如何将菜单选择与您拥有的菜单选项数进行比较 - 但这很危险,因为它们是不同的类型.所以不要这样做.


Keith Sirmon.. 7

我认为,如果您的业务案例指示负数无效,您可能希望显示或抛出错误.

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