在类C语言中编程时,“默认”整数类型应该是int还是uint/unsigned int?默认情况下,我的意思是当您不需要负数,但其中任何一个都应该很容易地足够大,以容纳您持有的数据。我可以为这两种情况想出很好的理由:
signed:在数学上表现更好,如果在一些你没有想到的边界情况下尝试低于零,则奇怪行为的可能性较小,通常可以更好地避免奇怪的边角情况。
unsigned:提供一点防止溢出的额外保证,以防您对值的假设是错误的。用作说明文件,说明变量表示的值应为为负数。
发布于 2009-10-12 15:19:52
Google C++ Style Guide对无符号整数有一个有趣的看法:
(引述如下:)
无符号整数上的
有些人,包括一些教科书作者,建议使用无符号类型来表示从不为负的数字。这是一种自我记录的形式。然而,在C中,这类文档的优势被它可能引入的真正错误所掩盖。考虑一下:
for (unsigned int i = foo.Length()-1; i >= 0; --i) ...
这段代码永远不会终止!有时,gcc会注意到这个bug并警告你,但通常不会。在比较有符号变量和无符号变量时,也会出现同样糟糕的错误。基本上,C的类型提升方案会导致无符号类型的行为与预期的不同。
因此,使用断言来记录变量是非负的。不要使用无符号类型。
(结束引用)
发布于 2009-10-12 15:39:54
作为一个粗略的经验法则,我使用无符号整数来计算事物,使用有符号整数来测量事物。
如果您发现自己从无符号整型中递减或减去,那么您应该处于这样的上下文中:您应该非常小心地避免下溢(例如,因为您在一些低级代码中从字符串的末尾逐步后退,所以当然您首先要确保字符串足够长以支持这一点)。如果你不在这样的上下文中,不能低于零是绝对重要的,那么你应该使用有符号的值。
在我的用法中,无符号整数是指那些绝对不能变成负数的值(或者对于你实际上想要模2^N算术的百万分之一的情况),而不是那些碰巧不是负数的值,在目前的实现中可能是这样。
发布于 2009-10-12 15:16:32
我倾向于使用有符号的,除非我知道我需要无符号的,因为int
通常是有符号的,而且键入unsigned int
需要更多的努力,而uint
可能会让另一个程序员稍微停下来思考这些值可以是什么。
所以,我看不出缺省为unsigned有什么好处,因为正常的int是有符号的。
https://stackoverflow.com/questions/1555154
复制相似问题