Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 长度/计数的有符号与无符号整数_C#_C++_Unsigned_Signed - Fatal编程技术网

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

C# 长度/计数的有符号与无符号整数,c#,c++,unsigned,signed,C#,C++,Unsigned,Signed,对于表示长度或计数变量,最好使用有符号或无符号整数 P> >我觉得C++ STL倾向于无符号( STD::SiZeZt),如C,而C更倾向于有符号整数(如in .< /P>)。 考虑到长度或计数是非负整数,我的直觉会选择无符号;但我无法理解.NET设计者为什么选择有符号整数 最好的方法是什么?每种方法的优缺点是什么?如果您没有设计可重用的库(用.NET术语来说,例如VB.NET项目消耗您的C#类库)然后选择适合您的。当然,如果您正在创建任何类型的DLL,并且您的库可以用不同的语言在项目中使用是

对于表示长度或计数变量,最好使用有符号无符号整数

<> P> >我觉得C++ STL倾向于无符号(<代码> STD::SiZeZt),如C,而C更倾向于有符号整数(如in .< /P>)。 考虑到长度或计数是非负整数,我的直觉会选择无符号;但我无法理解.NET设计者为什么选择有符号整数


最好的方法是什么?每种方法的优缺点是什么?

如果您没有设计可重用的库(用.NET术语来说,例如VB.NET项目消耗您的C#类库)然后选择适合您的。当然,如果您正在创建任何类型的DLL,并且您的库可以用不同的语言在项目中使用是可行的(再次想到VB.NET),那么您需要注意不兼容的类型(未签名).

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

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

然而,这两种情况都是边缘情况。对于大多数情况,有符号的
int
足够大。 因此,只要两者都能提供您需要的范围,您就可以同时使用它们

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

对于有符号整数,这很容易检测。对于无符号整数,它将环绕并变成
UINT\u MAX
。这使得检测错误变得更加困难,因为您期望的是正数,而您得到的是正数

所以,这取决于。C++使用无符号,因为它需要使用.Neal.NET使用签名,因为它需要与没有签名的语言一起工作。


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

< P>自然地使用无符号类型来计算计数和大小,除非我们在某些上下文中是否定的,但仍然是有意义的。我猜想C++遵循了它的哥哥C的相同逻辑,其中<代码> STRUNLY()返回
size\u t
malloc()
获取
size\u t

< C++(和C)中的问题>对于有符号整数和无符号整数,当您混合使用这两种整数时,您必须知道它们是如何相互转换的。有些人主张对所有整数使用有符号整数,以避免程序员的无知和疏忽。但我认为程序员必须知道如何使用他们的交易工具(编程语言、编译器等)。它们迟早会被转换所咬,如果不是在它们所写的东西中,那么是在其他人所写的东西中。这是不可避免的


因此,了解你的工具,选择适合你情况的工具。

这里有几个方面:

1) 最大值:通常有符号数字的最大值是相应无符号最大值的1/2。例如,在C中,最大有符号短值是32767,而最大无符号短值是65535(因为-ve数字不需要范围的1/2)。因此,如果您期望的长度或计数将很大,则无符号表示更有意义

2) 安全性:您可以浏览网络以查找整数溢出错误,但请想象以下代码:

if (length <= 100)
{
  // do something with file
}

if(length)你必须检查一下:我怀疑C#使用有符号整数是因为你猜对了。这主要是因为微软想传播“跨语言合作”,这是他们的.NET计划的关键架构点,即公共语言运行时。由于语言之间的兼容性问题,引入多种类型的整数是不可接受的,因此它被声明为不符合CLS。在这里,如果您决定使用它们并希望符合CLS,您会收到很少的警告,这是一个有价值的问题可以说是社会成员。:当然,你的意思是
UINT_MAX
。你可以将你的无符号索引与数组大小或
INT_MAX
进行比较,以发现溢出。大于或等于?警报!@Alex yah,修复了这个问题。当然,数组的大小可能未知。或者,这可能不是一个简单的索引操作,但也可能是其他操作er函数,其中任何正数都可能有效,但负数则不有效。关键是,有时使用both@jalf:首先,感谢您的精彩回答。从您所写的内容来看,我的理解正确吗?使用
带符号的
整数比使用
无符号的
更安全?如果正确,BCL可能使用带符号的除了CLS约束之外,还有其他的整数吗?@Mr_C64:这取决于上下文。我只是简单地指出了一种可能更安全的情况。Alex展示了另一种情况,在这种情况下,它没有任何区别(并且使用无符号整数时,错误检查实际上变得更简单)。您必须自己考虑这一点,以适应您需要它的具体情况。:)没错,但是在16位系统中使用unsigned来覆盖所有可能的范围确实是有意义的,而在32位系统中则没有。一旦接近数十亿个元素,就可以使用64位类型。在日常代码中使用unsigned通常会引起错误、警告、混乱和痛苦。另一个问题可能是类似
而(--size>=0)的代码…
size
为无符号时,该条件始终为真。另一方面,
while(size-->0)
是一个可靠的习惯用法(虽然大多数使用C/C++,但由于强调太多,所以没有那么多C#