86

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

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

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

我知道 Java 没有无符号值,这一定是Sun Microsystems的一个有意识的决定。

4

5 回答 5

70

我很高兴在这个主题上找到了一个很好的对话,因为我之前并没有真正考虑过。

总之,有符号是一个很好的通用选择——即使你确定所有数字都是正数——如果你要对变量进行算术运算(比如在典型的 for 循环情况下)。

unsigned 在以下情况下开始变得更有意义:

  • 要按位做一些事情,比如掩码,或者
  • 迫切希望利用符号位来获得额外的正值范围

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

于 2008-08-02T03:49:21.987 回答
10

在上面的示例中,当 'i' 始终为正并且更高的范围将是有益的时,无符号将很有用。就像您使用“声明”语句一样,例如:

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

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

但是,如果您正在执行一个会计程序,其中人们对他们的钱不负责任并且经常处于亏损状态,那么您肯定会想要使用“签名”。

我确实同意圣徒的观点,但一个好的经验法则是使用带符号的,C 实际上默认使用它,所以你被覆盖了。

于 2008-08-02T04:31:54.803 回答
10

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

With that in mind, I only just recently found out about unsigned integers while working on a project processing data in a binary file and storing the data into a database. I was purposely "corrupting" the binary data, and ended up getting negative values instead of an expected error. I found that even though the value converted, the value was not valid for my business case.
My program did not error, and I ended up getting wrong data into the database. It would have been better if I had used uint and had the program fail.

于 2008-11-10T19:04:05.793 回答
8

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

自然地,您编译时会出现警告,对吗?

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

使用有符号数字的缺点是有重载它们的诱惑,例如,值 0->n 是菜单选择,-1 表示没有选择任何内容 - 而不是创建一个有两个变量的类,一个指示是否选择了某些东西,另一个用于存储该选择是什么。在不知不觉中,您正在到处测试负数,编译器抱怨您希望如何将菜单选择与您拥有的菜单选择数量进行比较——但这很危险,因为它们是不同的类型. 所以不要那样做。

于 2008-08-04T13:35:41.273 回答
6

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

于 2008-08-02T05:51:57.247 回答