2010-07-15 23 views
8

在我开始使用C#之前,我主要来自C/C++背景。其中一件事我与在C#中的第一个项目做的是让这样的为什么在C#中很难使用未签名的CLR类型?

class Element{ 
    public uint Size; 
    public ulong BigThing; 
} 

我当时被这需要事实羞愧类铸件:

int x=MyElement.Size; 

一样

int x=5; 
uint total=MyElement.Size+x; 

为什么语言设计者决定让有符号和无符号整数类型不能隐式转换?为什么在整个.NET库中未使用无符号类型?例如String.Length永远不能为负,但它是一个有符号的整数。

+1

即使在C++中,从unsigned到signed或cast的转换也会导致警告。 – 2010-07-15 20:57:58

+0

@Seva取决于编译器:P ..我意识到我的第一个案例是一个弱案例,但我的第二个案例实际上更多的是我的意思,因为没有数据丢失的机会,除非'x'为负 – Earlz 2010-07-15 21:01:55

+0

在第二个计数,请参阅下面的回复... – 2010-07-15 21:06:31

回答

18

为什么语言设计者决定让有符号和无符号整数类型不是 隐式可转换?

因为这可能会丢失数据或抛出任何异常,这两者通常都是隐含的好事。 (从长的隐式转换翻一番可以输过,无可否认,而是以不同的方式。数据)

为什么是无符号类型不是整个NET库使用更

无符号类型不符合CLS标准 - 并非所有的.NET语言都支持它们。例如,Visual Basic对.NET 1.0和1.1中的未签名数据类型没有“本机”支持;它被添加到2.0的语言。 (您仍然可以使用它们,但它们不是语言本身的一部分 - 你不能使用普通的算术运算符,例如。)

+3

“虽然我可能是错的” - 你的意思是.NET可能是错的? – PostMan 2010-07-15 21:00:13

+0

@PostMan:我刚刚发现了更多信息......将被编辑。 – 2010-07-15 21:05:01

1

由于隐含转换的3B无符号整数到有符号整数会去炸掉。

无符号具有签名的最大值的两倍。这与你无法对int进行长时间处理的原因是一样的。

+0

有足够信誉的人可以编辑正确的,将“3B的无符号整数转换为有符号整数?”他的意图很清楚,只是一个错字。 – 2010-07-15 21:09:45

+0

感谢戴夫,我甚至重新读了它,并错过了它:x – 2010-07-16 12:49:14

4

随着乔恩的答案,只是因为一个无符号数不能为负数并不意味着它是不是比一个签更大。 uint是0至4,294,967,295,但是int是-2,147,483,648至2,147,483,647。上面的空间充足,最大损失为int

0

在第二计:因为他们想在CLR能与没有无符号的数据类型语言兼容(读:VB.NET)。

+0

VB.net自从2.0以来有无符号数字。我没有意识到他们之前错过了,但这会很有意义 - 他们没有及时进入VB并将其加入CLS。 – cHao 2010-07-15 21:08:25

+0

但是,改变.NET v2中的String类(或者就此而言)会破坏大量的代码。 – 2010-07-15 21:10:20

1

我当时的事实感到羞愧,这需要铸造:

int x=MyElement.Size; 

但是你在这里自相矛盾。如果你真的(真的)需要Size来进行无符号比赋值(签名)x是一个错误。代码中存在深层次的缺陷。

比如字符串。长度不能为负,但它是一个符号整数

但String.IndexOf可以返回一个负数,这将是尴尬,如果不同类型的string.length减和指标值,其中。虽然理论上在无符号String.Length(4 GB上限)中会有优点,但实际上即使当前的2GB也足够大(因为该长度的字符串很少且无法运行)。

所以真正的答案是:为什么首先使用unsigned?

+0

那么,因为它允许更广泛的无符号数表达? – 2010-07-15 21:21:35

+0

@亨克:我认为使用int的一个更好的例子是“Array.Length”。人们永远不会期望数组具有负大小,并且使用带符号的类型会将数组的(已报告的)大小限制在略低于2GB。另外,数组索引可能永远不是负数。现在被授予,有'LongLength'属性将数组大小报告为'Int64' - 但它仍将其报告为有符号值。在这些情况下,最重要的考虑因素是.NET的设计人员选择使无符号类型不符合CLS。在这一点上不太可能改变的东西。 – LBushkin 2010-07-15 21:27:55

+0

@Paul:'decimal'的范围更广。问题是无签名的_practical_用法。 OP没有提供任何。 – 2010-07-15 21:29:30

相关问题