当用类C语言编程时,一个人的"默认"整数类型是int还是uint/unsigned int?默认情况下,我的意思是当你不需要负数时,但任何一个都应该足够大,足以容纳你所持有的数据.我可以为两者考虑好的论点:
签名:数学上表现更好,如果你试图在一些你没想到的边界情况下低于零,那么奇怪行为的可能性就会降低,通常可以更好地避免奇怪的角落情况.
unsigned:为溢出提供一点额外的保证,以防你对值的假设是错误的.作为文档,变量表示的值永远不应为负数.
在谷歌C++风格指南对无符号整数一个有趣的观点:
(引用如下:)
在无符号整数上
有些人,包括一些教科书作者,建议使用无符号类型来表示从不否定的数字.这是一种自我记录的形式.然而,在C中,这些文档的优点被它可以引入的真正错误所抵消.考虑:
for (unsigned int i = foo.Length()-1; i >= 0; --i) ...
此代码永远不会终止!有时gcc会注意到这个bug并警告你,但通常不会.比较有符号和无符号变量时,可能会发生同样糟糕的错误.基本上,C的类型提升方案会导致无符号类型的行为与预期的不同.
因此,使用断言记录变量是非负的.不要使用无符号类型.
(结束语)
当然签了.如果溢出让你担心,下溢会让你更担心,因为意外地"低于零"比int-max更容易.
"unsigned"应该是一个有意识的选择,让开发人员考虑潜在的风险,只在那里使用,你绝对肯定你永远不会消极(甚至不是偶然),并且你需要额外的价值空间.