当前位置: 首页 > 编程语言 > C#

长度-计数的有符号和无符号整数共享

时间:2023-04-10 18:41:26 C#

长度/计数的有符号和无符号整数表示长度或计数变量,用有符号整数好还是无符号整数好?在我看来,C++STL倾向于选择无符号(??std::size_t,如std::vector::size()),而C#BCL倾向于选择有符号整数(如ICollection.Count)。鉴于length或count是非负整数,我的直觉是选择无符号;但我不明白为什么.NET设计者选择有符号整数。最好的方法是什么?各自的优缺点是什么?C++使用无符号值,因为它们需要完整的范围。在32位系统上,该语言应该能够使用4GB向量,而不仅仅是2GB向量。(操作系统可能不允许您使用完整的4GB,但语言本身不想妨碍您)在.NET中,无符号整数不符合CLS。您可以使用它们(在某些.NET语言中),但它限制了可移植性和兼容性。所以对于基类库,他们只使用有符号的整数。然而,这些都是边缘情况。在大多数情况下,有符号整数足够大。因此,只要它们提供您需要的范围,您就可以使用两者。Signedints有时它们的一个优点是可以更容易地检测下溢。假设您正在计算数组索引,并且由于程序中的某些错误输入或逻辑错误,您最终尝试访问索引-1。使用有符号整数,很容易检测到。当使用unsigned时,它环绕并变成UINT_MAX。这使得检测错误变得更加困难,因为您期望一个正数,而您得到了一个正数。真的,这取决于。C++使用unsigned,因为它需要作用域。.NET使用signed是因为它需要没有unsigned的语言。在大多数情况下,两者都可以工作,有时,签名可以使您的代码对错误检测更加健壮。将无符号类型用于计数和大小是很自然的,除非我们遇到它们可以为负且有意义的情况。我的猜测是C++遵循与其兄弟C相同的逻辑,其中strlen()返回size_t而malloc()需要size_t。C++(和C)中有符号和无符号整数的问题在于,当您将两者混合使用时,您必须知道它们如何相互转换。有人提倡用有符号整数转整数来避免这种程序员无知和疏忽的问题。但我认为程序员必须知道如何使用他们的行业工具(编程语言、编译器等)。迟早他们会被转换所困,如果不是他们写的,那么其他人就有了。这是不可避免的。因此,了解您的工具并选择适合您情况的工具。这里有几个方面:1)最大值:通常,有符号数的最大值是相应无符号数最大值的1/2。例如,在C中,最大有符号短整型值是32767,而最大无符号短整型值是65535(因为-ve数字不需要范围的1/2)。因此,如果您的预期长度或计数变大,则无符号表示更有意义。2)安全性:您可以浏览网络查找整数溢出错误,但想象一下这样的代码:恶意的,一些演员等)并且代码没有按预期工作。我在以前的项目中看到过这种情况,其中每个事务的序列都递增,但是当我们使用带符号的整数来获取最大带符号的int值时(2147483647),它在下一次增量后突然变成-ve并且我们的代码无法处理它。无论底层语言/API考虑如何,都有一些事情需要考虑。如果你不设计可重用的库(在.NET术语中,例如使用您的C#类库的VB.NET项目),然后选择适合您的方法。当然,如果您正在创建任何类型的DLL,并且您的库可以用不同的语言使用(同样,VB.NET来mind),那么就需要注意非规范类型(unsigned)以上就是C#学习教程的全部内容:长度/计数的有符号和无符号整数。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: