何时在签名变量上使用无符号变量是否合适?在for
循环中怎么样?
我听到很多关于此的意见,我想看看是否有任何类似的共识。
for (unsigned int i = 0; i < someThing.length(); i++) {
SomeThing var = someThing.at(i);
// You get the idea.
}
我知道Java没有无符号值,这一定是Sun Microsystems'部分的一个有意思的决定。
答案 0 :(得分:64)
我很高兴在这个问题上找到a good conversation,因为我以前没有多想过。
总之,签名是一个很好的一般选择 - 即使你确定所有数字都是正数 - 如果你要对变量进行算术运算(比如典型的for循环情况)。
如果你要做面具这样的按位,那么无符号的开始会更有意义。或者,如果你急于通过利用符号位获得额外的正范围。
就我个人而言,我喜欢签名,因为我不相信自己保持一致,避免混淆两种类型(如文章警告)。
答案 1 :(得分:8)
在上面的示例中,当'i'始终为正且更高的范围将是有益的时,无符号将是有用的。就像你使用'declare'语句一样,例如:
#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)
特别是当这些值永远不会改变时。
然而,如果你正在做一个会计程序,人们对他们的钱不负责任并且经常处于亏损状态,你肯定会想要使用'签名'。
我同意圣人的观点,但是一个好的经验法则是使用signed,C实际默认使用,所以你被覆盖了。
答案 2 :(得分:7)
当您比较有符号和无符号类型时,C和C ++编译器将生成警告;在您的示例代码中,您无法使您的循环变量无符号并让编译器生成没有警告的代码(假设已打开警告)。
当然,你正在编写警告,一直向上,对吗?
并且,您是否考虑过将“将警告视为错误”进行编译以使其更进一步?
使用带符号的数字的缺点是有一个让它们超载的诱惑,例如,值0-> n是菜单选择,-1表示没有选择 - 而不是创建一个有两个的类变量,一个用于指示是否选择了某些内容,另一个用于存储选择内容。在您知道它之前,您正在测试各地的负面消息并且编译器抱怨您希望如何将菜单选择与您拥有的菜单选项数进行比较 - 但这很危险,因为它们是不同的类型。所以不要这样做。
答案 3 :(得分:7)
我认为如果您的商业案例规定负数无效,您希望显示或抛出错误。
考虑到这一点,我最近刚刚发现了无符号整数,同时处理项目处理二进制文件中的数据并将数据存储到数据库中。我故意“破坏”二进制数据,最终获得负值而不是预期的错误。我发现即使转换了价值,该值对我的商业案例也无效
我的程序没有错误,我最终将错误的数据输入数据库。如果我使用uint
并使程序失败,那会更好。
答案 4 :(得分:6)
size_t
通常是一个不错的选择,如果您使用的是STL类,则为size_type
。