通常已知值为正。例如,TCP/UDP序列号总是正值。int
和unsigned int
都足够大,可以存储最大的sequence number
,所以我可以使用这些类型中的任何一种。还有许多已知值为正的例子。
当常规signed
型容量足够时,是否有理由使用unsigned
型?
我个人倾向于使用常规类型,因为:
-
int
可能比uint
或unsigned int
更具可读性 - 我不需要包括额外的标题
UINT
等 - 我将避免在程序的其他地方额外的强制类型转换
使用unsigned
类型的原因我可以想象:
- 帮助编译器生成更好的代码?
- 帮助另一个程序员理解变量是无符号的
- 避免可能的bug(例如,当int被赋值为UINT时编译器可能会产生编译时错误,我们应该检查我们分配的值不是负的)
原因之一是比较有符号数和无符号数可能会导致令人惊讶的结果。在C和(我认为)c++中,比较有符号数和无符号数会导致有符号数被解释为无符号数。如果带符号的值恰好是负的,那么将其读取为unsigned将得到一个比任何无符号数都大的值,这不是您想要的。这个问题在Objective-C中有一个例子,它使用与c相同的转换规则。