为了表示长度或计数变量,是否最好使用有符号的或无符号的整数?
在我看来,C++ STL倾向于使用无符号(std::size_t
,就像在std::vector::size()中一样,相反,C#BCL倾向于青睐带符号的整数(例如在ICollection.Count中。
考虑到长度或计数是非负整数,我的直觉将选择unsigned;但是我不明白为什么.NET设计人员选择带符号的整数。
最好的方法是什么?每个优点和缺点是什么?
最佳答案
C++使用无符号值,因为它们需要完整范围。在32位系统上,该语言应使其具有4 GB的 vector ,而不仅仅是2 GB的 vector 。 (操作系统可能不允许您使用全部4 GB的空间,但语言本身不想让您感到烦恼)
在.NET中,无符号整数不符合CLS。您可以使用它们(在某些.NET语言中),但是它限制了可移植性和兼容性。因此,对于基类库,它们仅使用带符号的整数。
但是,这些都是极端情况。在大多数情况下,签名的int
足够大。
因此,只要两者都能提供所需的范围,就可以同时使用。
有符号整数有时具有的一个优点是,它们使检测下溢更加容易。假设您正在计算数组索引,并且由于某些错误的输入或程序中的逻辑错误,您最终将尝试访问索引-1
。
使用带符号的整数,很容易检测到。如果使用unsigned,它将环绕并变成UINT_MAX
。这使检测错误变得更加困难,因为您期望一个正数,并且得到一个正数。
真的,这取决于。 C++使用无符号,因为它需要范围。 .NET使用带符号的,因为它需要使用未带符号的语言。
在大多数情况下,这两种方法都可以使用,有时,签名也可以使您的代码更可靠地检测错误。