长度/计数的有符号与无符号整数

22 c# c++ unsigned signed

为了表示长度或计数变量,使用有符号无符号整数是否更好?

在我看来,C++ STL往往更喜欢无符号(std::size_t就像在std :: vector :: size()中一样,而C#BCL往往更喜欢有符号整数(比如在ICollection.Count中).

考虑到长度或计数是非负整数,我的直觉会选择无符号 ; 但我不明白为什么.NET设计者选择了有符号整数.

什么是最好的方法?每个人的利弊是什么?

jal*_*alf 23

C++使用无符号值,因为它们需要全范围.在32位系统上,该语言应该可以使用4 GB的矢量,而不仅仅是2 GB的矢量.(操作系统可能不允许你使用所有4 GB,但语言本身并不想妨碍你)

在.NET中,无符号整数不符合CLS.您可以使用它们(在某些.NET语言中),但它限制了可移植性和兼容性.因此对于基类库,它们只使用有符号整数.

但是,这些都是边缘情况.在大多数情况下,签署的int足够大的.因此,只要两者都提供您需要的范围,您就可以同时使用它们.

有符号整数有时具有的一个优点是它们可以更容易地检测下溢.假设您正在计算数组索引,并且由于某些错误输入或程序中的逻辑错误,您最终会尝试访问索引-1.

使用有符号整数,易于检测.随着未签名,它将环绕并成为UINT_MAX.这使得检测错误变得更加困难,因为您期望得到一个正数,并且您得到一个正数.

真的,这取决于.C++使用unsigned,因为它需要范围..NET使用签字,因为它需要与不语文工作签名.

在大多数情况下,两者都可以工作,有时候,签名可以使您的代码更有力地检测错误.

  • 确实,然而使用无符号覆盖16位系统中真正有意义的完整可能范围,而不是32位.一旦接近数十亿个元素,就可以使用64位类型.在日常代码中没有签名主要是吸引错误,警告,混乱和痛苦. (2认同)