2013-04-24 50 views
9

通常已知值是正值。例如,TCP/UDP序列号总是正值。 intunsigned int都足以存储最大的sequence number,所以我可以使用这些类型中的任何一种。还有很多其他的例子,值已知是积极的。每次我知道我正在处理无符号值时,我应该使用“无符号”吗?

是否有任何理由使用unsigned类型时,常规signed类型的容量是否足够(通常绰绰有余)?

我个人倾向于使用常规的类型,因为:

  • int可能是一个有点更具可读性比uintunsigned int
  • 我并不需要包括额外的头为UINT
  • 我将避免在程序中的其他地方进一步投入

使用原因unsigned类型我可以想象:

  • 帮助编译器生成更好的代码?
  • 帮助其他程序员理解变量是无符号
  • 避免可能出现的错误(例如,当INT被分配到UINT编译器可能会产生编译时错误,我们应该检查我们分配一个值不为负)
+0

有关此处的一些想法:http://embeddedgurus.com/stack-overflow/2009/08/a-tutorial-on- signed-and-unsigned-integers/ – Morwenn 2013-04-24 09:36:57

+1

谢谢,我刚才发现这个问题http://stackoverflow.com/questions/12225521/should-unsigned-ints-be-used-if-not-necessary?rq= 1 – javapowered 2013-04-24 09:38:02

+1

没有。有一些反对使用'unsigned'的争论 - Stroustrup在某处传递了C++编程语言 - 拉科斯在他的一本书中写了一篇关于它的章节:单调乏味。示例问题:如果你有值a和b,'abs(a - b)'倾向于直观地用于整数,但不是无符号的;值得注意的是标准转换可以默默启动,所以您可能希望从无符号使用中获得的支票无论如何都不起作用 - 负值变得无声无息,反之亦然。 – 2013-04-24 09:39:16

回答

1

一个原因是,比较有符号和无符号数字可能会导致令人惊讶的结果。在C和(我认为)C++中,比较有符号和无符号数将导致有符号数被解释为无符号数。如果带符号的值恰好是负值,则将其读为无符号将给出比任何无符号数更大的值,这不是您想要的值。有关Objective-C中的示例,请参见this question,它使用与C相同的转换规则。