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

jav*_*red 9 c++ signedness

通常,价值观是积极的.例如,TCP/UDP序列号始终为正值.两者intunsigned int有足够大的存储即使是最大的sequence number,所以我可以使用这些类型.当已知值为正值时,还有许多其他示例.

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

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

  • int可能比uint或更具可读性unsigned int
  • 我不需要包含额外的标题UINT等.
  • 我会在程序中的某个地方避免额外的演员阵容

使用unsignedI型的原因可以想象:

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

Cal*_*leb 1

原因之一是比较有符号数和无符号数可能会产生令人惊讶的结果。在 C 和(我认为)C++ 中,比较有符号数和无符号数会导致有符号数被解释为无符号数。如果有符号值恰好为负数,则将其读取为无符号数将给出比任何无符号数更大的值,这不是您想要的。看到这个问题以获取 Objective-C 中的示例,该示例使用与 C 相同的转换规则。