我是否应该在每次知道我正在处理无符号值时使用"unsigned"?



通常已知值为正。例如,TCP/UDP序列号总是正值。intunsigned int都足够大,可以存储最大的sequence number,所以我可以使用这些类型中的任何一种。还有许多已知值为正的例子。

当常规signed型容量足够时,是否有理由使用unsigned型?

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

  • int可能比uintunsigned int更具可读性
  • 我不需要包括额外的标题UINT
  • 我将避免在程序的其他地方额外的强制类型转换

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

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

原因之一是比较有符号数和无符号数可能会导致令人惊讶的结果。在C和(我认为)c++中,比较有符号数和无符号数会导致有符号数被解释为无符号数。如果带符号的值恰好是负的,那么将其读取为unsigned将得到一个比任何无符号数都大的值,这不是您想要的。这个问题在Objective-C中有一个例子,它使用与c相同的转换规则。

相关内容

最新更新