默认int类型:签名还是未签名?

时间:2009-10-12 15:13:23

标签: language-agnostic coding-style

当用类C语言编程时,一个人的“默认”整数类型是int还是uint / unsigned int?默认情况下,我的意思是当你不需要负数时,但任何一个都应该足够大,足以容纳你所持有的数据。我可以为两者考虑好的论点:

signed:在数学上表现得更好,如果你试图在一些你没想到的边界情况下试图低于零,那么奇怪行为的可能性就会降低,通常可以更好地避免奇怪的角落情况。

unsigned:为溢出提供一点额外的保证,以防你对值的假设是错误的。作为文档,变量代表的值应永远不为负。

7 个答案:

答案 0 :(得分:13)

Google C++ Style Guide对无符号整数有一个有趣的看法:

(引用如下:)

在无符号整数上

有些人,包括一些教科书作者,建议使用无符号类型来表示从不否定的数字。这是一种自我记录的形式。然而,在C中,这些文档的优点被它可以引入的真正错误所抵消。考虑:

for (unsigned int i = foo.Length()-1; i >= 0; --i) ...

此代码永远不会终止!有时gcc会注意到这个bug并警告你,但通常不会。比较有符号和无符号变量时,可能会发生同样糟糕的错误。基本上,C的类型提升方案会导致无符号类型的行为与预期的不同。

因此,使用断言记录变量是非负的。不要使用无符号类型。

(结束语)

答案 1 :(得分:11)

当然签了名。如果溢出让你担心,下溢会让你更担心,因为意外地“低于零”比int-max更容易。

“unsigned”应该是一个有意识的选择,让开发人员考虑潜在的风险,只在那里使用,你绝对肯定你永远不会消极(甚至不是偶然),并且你需要额外的价值空间。 / p>

答案 2 :(得分:4)

作为一个粗略的经验法则,我使用无符号整数来计算事物,并签署了用于测量事物的整数。

如果你发现自己正在减少或减去unsigned int,那么你应该处在一个你已经期望非常小心不要下溢的环境中(例如,因为你在某些低级代码中退步)从字符串的末尾开始,所以当然你首先确保字符串足够长以支持这个)。如果你不在这样的环境中,那么你不应该低于零是绝对关键的,那么你应该使用一个有符号的值。

在我的用法中,无符号整数用于绝对不能为负的值(或者在百万种情况下实际需要模2 ^ N算术的那个),而不是对于那些恰好不会为负的值,当前的实施,可能。

答案 3 :(得分:3)

我倾向于使用签名,除非我知道我需要无符号,因为int通常是签名的,并且输入unsigned int需要花费更多精力,而uint可能会导致另一个程序员稍微停顿一下,思考价值观是什么。

因此,我认为默认为无符号没有任何好处,因为正常的int是签名的。

答案 4 :(得分:2)

对于未签名的人,你没有得到太多“溢出保证”。你有可能得到不同但更奇怪的行为,而不是签名,但稍晚一点......更好的事先得到那些假设吗?

答案 5 :(得分:1)

提供更具体的类型赋值(如unsigned int)可以传达有关变量用法的更多信息,并可以帮助编译器在分配“不正确”值时随时跟踪。例如,如果您使用变量来跟踪对象/元素的数据库ID,那么(可能)永远不应该是ID小于零(或一个)的时间;在这种情况下,使用无符号整数值而不是声明该状态,而不是将该语句传达给其他开发人员以及编译器。

答案 6 :(得分:0)

我怀疑对此有一个非常好的语言无关的答案。语言之间存在足够的差异,以及它们如何处理混合类型,没有一个答案对所有人(甚至大多数人)都有意义。

在我经常使用的语言中,我使用signed,除非我有特定的理由不这样做。这主要是C和C ++。在另一种语言中,我可能会给出不同的答案。