什么时候适合使用无符号变量而不是有符号变量?那么在一个 for 环形?

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

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

我知道 Java 没有无符号值,这一定是一个有意识的决定 太阳微系统公司' 部分。

有帮助吗?

解决方案

我很高兴发现 一次愉快的谈话 关于这个问题,因为我之前并没有真正考虑过这个问题。

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

如果你要做像掩码这样的按位操作,那么无符号开始更有意义。或者,如果您迫切希望通过利用符号位来获得额外的正范围。

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

其他提示

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

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

尤其是当这些价值观永远不会改变时。

然而,如果你正在做一个会计程序,其中人们对他们的钱不负责任并且经常出现亏损,那么你肯定会想要使用“签名”。

我确实同意 saint 的观点,不过一个好的经验法则是使用有符号的,C 实际上默认使用有符号,所以你就可以了。

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

当然,您在编译时会一直调高警告,对吧?

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top