何时使用无符号值超过符号值?

什么时候使用未签名的变量适用于已签名的变量?在 for 循环中怎么样?

我听到很多这方面的意见,我想看看是否有什么类似的共识。

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

我知道Java没有无符号值,这一定是关于 Sun Microsystems 的一个明智决定。 '部分。

0
额外 编辑
意见: 3
额外 作者 mk12,
我认为这个问题是基于意见的。所提供的代码将在两种情况下运行得很好,因此您可以同时使用这两种情况。除了性能方面的原因(迄今为止没有答案实际上涉及到性能),这只是个人的品味。
额外 作者 Trilarion,

5 答案

我很高兴找到良好的对话关于这个问题,因为我之前没有真正考虑过它。

总之,签名是一个很好的普遍选择 - 即使你确信所有数字都是正数 - 如果你要对变量进行算术运算(就像典型的循环情况一样)。

如果你打算做一些像面具一样的事情,无签名的开始会更有意义。或者,如果你不顾一切地利用符号位来获得额外的正范围。

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

0
额外
稍后在该线程中,显示​​ unsigned 对于检测不可信输入中的溢出而言是非常优越的。不幸的是,对这个难题提出的“答案”并不是那么好。 mine是 template bool range_check_sum(unsigned a,unsigned b){return(a 如果任何人使用签名类型都有类似的简单和直接的答案,我很乐意看到它。
额外 作者 Ben Voigt,

size_t is often a good choice for this, or size_type if you're using an STL class.

0
额外
只有当你处理字节大小的东西。
额外 作者 mk12,

在你上面的例子中,当'i'总是正值时,更高的范围将会是有益的,未签名将是有用的。就像你使用'declare'语句一样,例如:

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

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

然而,如果你正在做一个会计计划,人们对他们的钱不负责任并且一直处于危急状态,那么你肯定会想用'signed'。

我同意圣人的看法,虽然一个好的经验法则是使用签名,C实际上是默认的,所以你被覆盖了。

0
额外

比较有符号和无符号类型时,C和C ++编译器会生成警告;在你的示例代码中,你不能让你的循环变量无符号,并让编译器生成没有警告的代码(假设打开了警告)。

自然,你正在编译警告,一直向上转,对吧?

而且,您是否考虑过编写“将警告视为错误”,让它更进一步?

The downside with using signed numbers is that there's a temptation to overload them so that, for example, the values 0->n are the menu selection, and -1 means nothing's selected - rather than creating a class that has two variables, one to indicate if something is selected and another to store what that selection is. Before you know it, you're testing for negative one all over the place and the compiler is complaining about how you're wanting to compare the menu selection against the number of menu selections you have - but that's dangerous because they're different types. So don't do that.

0
额外

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

考虑到这一点,我只是最近才发现有关无符号整数,同时处理一个处理二进制文件中的数据并将数据存储到数据库中的项目。我故意“破坏”二进制数据,最终得到负值而不是预期的错误。我发现即使转换后的价值,这个价值对我的商业案例来说也是无效的 我的程序没有错误,并且最终导致错误的数据进入数据库。如果我使用 uint 并且程序失败,那会更好。

0
额外