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

标签 c# c++ unsigned signed

对于表示长度或计数变量,使用 signed 还是 unsigned 整数更好?

在我看来,C++ STL 倾向于喜欢 unsigned (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

使用有符号整数,很容易检测到。使用无符号,它将环绕并成为 UINT_MAX。这使得检测错误变得更加困难,因为您期望一个正数,而您得到一个正数。

真的,这取决于。 C++ 使用无符号,因为它需要范围。 .NET 使用签名是因为它需要使用没有未签名的语言。

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

关于c# - 有符号与无符号整数的长度/计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10040884/

相关文章:

java - C++ STL 数据结构与 Java 的比较

java - 我需要帮助 : Send a list of bytes with UDP to a Server, o 它适用于有符号/无符号字节

c# - 如何从 Genymotion 连接到 MySql

c# - 合并排序的 IndexOutOfRangeException

c++ - xlc: 模板类的 sizeof 不工作

c++ - 恢复应用程序时 glUseProgram 中的 GL_INVALID_VALUE

c# - 动态加载控件上 Viewstate 的奇怪行为

c# - 如何解决 `dnx web`异常

c - 用 0xFF 屏蔽字符和强制转换(无符号字符)有什么区别

C、日志、二进制、数字四。他们不混合