9

在开始使用 C# 之前,我主要来自 C/C++ 背景。我在 C# 中的第一个项目中所做的其中一件事是创建一个这样的类

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

然后我对这需要铸造的事实感到羞愧:

int x=MyElement.Size;

一样

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

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

4

5 回答 5

18

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

因为这可能会丢失数据或抛出任何异常,这通常都不是隐式允许的好事。(诚​​然,从 long 到 double 的隐式转换也会丢失数据,但方式不同。)

以及为什么在 .Net 库中没有更多地使用无符号类型

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

于 2010-07-15T20:58:19.680 回答
4

与乔恩的回答一起,仅仅因为无符号数不能为负并不意味着它不大于有符号数。uint为 0 到 4,294,967,295,但int为 -2,147,483,648 到 2,147,483,647。超过int最大损失的空间很大。

于 2010-07-15T21:01:56.440 回答
1

因为将 3B 的无符号整数隐式转换为有符号整数会爆炸。

无符号的有符号最大值的两倍。这与您不能将 long 转换为 int 的原因相同。

于 2010-07-15T21:01:00.843 回答
1

然后我对这需要铸造的事实感到羞愧:

 int x=MyElement.Size;

但是你在这里自相矛盾。如果你真的(真的)需要 Size 是无符号的,而不是将它分配给(有符号的) x 是一个错误。您的代码中存在严重缺陷。

例如 String.Length 永远不能是负数,但它是一个有符号整数

但是 String.IndexOf 可以返回一个负数,如果 String.Length 和 Index 的值是不同的类型会很尴尬。

虽然理论上无符号 String.Length(4 GB 上限)会有好处,但实际上即使当前的 2GB 也足够大(因为这种长度的字符串很少见且无论如何都不可行)。

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

于 2010-07-15T21:18:07.413 回答
0

第二点:因为他们希望 CLR 与没有无符号数据类型的语言兼容(阅读:VB.NET)。

于 2010-07-15T21:05:53.913 回答