每当我知道我正在处理无符号值时,我应该使用“无符号”吗?

时间:2013-04-24 09:34:06

标签: c++ signedness

通常认为价值是积极的。例如,TCP / UDP序列号始终为正值。 intunsigned int都足以存储最大的sequence number,因此我可以使用这些类型中的任何一种。当已知值为正值时,还有许多其他示例。

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

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

  • int可能比uintunsigned int
  • 更具可读性
  • 我不需要为UINT等添加额外的标题。
  • 我会在程序的某个地方避免额外的演员

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

  • 帮助编译生成更好的代码?
  • 帮助其他程序员理解该变量是未签名的
  • 避免可能的错误(例如,当int分配给UINT编译器时,可能会产生编译时错误,我们应该检查我们分配的值是否为负数)

1 个答案:

答案 0 :(得分:1)

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