当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《默认int类型:签名还是未签名?》经验,为你挑选了2个好方法。

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

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

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



1> 小智..:

在谷歌C++风格指南对无符号整数一个有趣的观点:

(引用如下:)

在无符号整数上

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

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

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

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

(结束语)


实际上,我认为C的类型推广方案导致*signed*ints的行为与人们预期的不同.如果您知道模运算,则无符号整数表现良好,而签名整数则具有依赖于实现的行为和无处不在的转换.但是如果你只打算使用一个,为了避免混合它们,就必须签名.所以我同意不应该无条件地使用unsigned int的结论,但实际上我认为不应该使用向下循环...
由于GCC无法警告"unsigned> = 0"始终如此,这已经很长时间了.Google指南充其量是误导性的,最坏的情况是危险的,因为循环迭代器的一个非常常见且非常正确的类型是无符号类型`size_t`.使用零原点计数器向后计数时对无符号下溢的正确测试是"i!=〜0U".

2> Joris Timmer..:

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

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

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有