什么时候使用无符号值来签名?
什么时候使用未签名的variables适合于已签名的variables? 那么在for
循环呢?
我听到很多关于这个的意见,我想看看是否有什么共识。
for (unsigned int i = 0; i < someThing.length(); i++) { SomeThing var = someThing.at(i); // You get the idea. }
我知道Java没有无符号的值,这一定是Sun Microsystems的一个明智的决定。
我很高兴在这个问题上find一个很好的对话 ,因为我之前没有真正考虑过这个问题。
总之,签名是一个很好的普遍select – 即使你确信所有数字都是正数 – 如果你要对variables进行算术运算(就像典型的循环情况一样)。
如果你打算做一些像面具一样的事情,无签名开始变得更有意义。 或者,如果你不顾一切地利用符号位来获得额外的正范围,
就我个人而言,我喜欢签名,因为我不相信自己保持一致,避免混合两种types(如文章警告)。
在你上面的例子中,当'i'总是正值,而更高的范围会是有益的,unsigned将是有用的。 就像如果你使用'declare'语句,比如:
#declare BIT1 (unsigned int 1) #declare BIT32 (unsigned int reallybignumber)
特别是当这些值永远不会改变。
但是,如果你正在做一个会计程序,人们对钱不负责任,并且一直处于危急状态,那么你肯定会想用“签名”。
我同意圣徒,虽然一个好的经验法则是使用签名,C实际上默认,所以你被覆盖。
C和C ++编译器在比较有符号和无符号types时会产生警告; 在你的示例代码中,你不能使你的循环variables无符号,并让编译器生成没有警告的代码(假设所有的警告都被打开了)。
自然,你正在编译的警告一直向上,对不对?
而且,你是否考虑过编写“把警告当成错误”来把它更进一步呢?
使用带符号数字的缺点是有一个超载的诱惑,例如,0-> n的值是菜单select,-1表示没有select任何东西 – 而不是创build一个具有两个variables的类,一个指示是否select了某个选项,而另一个用于存储select的内容。 在你知道它之前,你正在testing一个负面的东西,编译器正在抱怨你想要比较菜单选项和菜单select的数量 – 但这是危险的,因为它们是不同的types。 所以不要这样做。
我认为,如果你的商业案例指出负数是无效的,你会想显示或抛出一个错误。
考虑到这一点,我只是最近才发现了一个处理二进制文件中的数据并将数据存储到数据库中的项目的无符号整数。 我故意“破坏”二进制数据,最终得到负值而不是预期的错误。 我发现,即使价值转换,价值是无效的我的商业案例。
我的程序没有错误,我最终得到错误的数据到数据库中。 如果我使用uint
并且程序失败,那会更好。
size_t
通常是一个很好的select,或者size_type
如果你使用的是STL类。