在我开始使用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
永远不会是负数,但它是有符号整数。
答案 0 :(得分:18)
为什么语言设计者决定不使用有符号和无符号整数类型 隐含地施法?
因为这可能会丢失数据或抛出任何异常,所以这两者通常都不是隐含允许的好事。 (从长到双的隐式转换也可能会丢失数据,不可否认,但是以不同的方式。)
为什么在整个.Net库中未使用的是无符号类型
无符号类型不符合CLS - 并非所有.NET语言都支持它们。例如,Visual Basic对.NET 1.0和1.1中的无符号数据类型没有“本机”支持;它被添加到2.0的语言中。 (您仍然可以使用它们,但它们不是语言本身的一部分 - 例如,您无法使用常规算术运算符。)
答案 1 :(得分:4)
与Jon的回答一样,仅仅因为无符号数不能为负数并不意味着它不比有符号数大。 uint
为0到4,294,967,295,但int
为-2,147,483,648到2,147,483,647。损失最多int
以上的空间。
答案 2 :(得分:1)
因为隐式地将无符号整数3B转换为有符号整数将会爆炸。
无符号的最大值是签名的两倍。这也是你不能把长期转换为int的原因。
答案 3 :(得分:1)
然后我被这个需要铸造的事实所羞辱:
int x=MyElement.Size;
但你在这里自相矛盾。如果你真的(真的)需要将Size指定为无符号而不是将其指定给(带符号)x则是错误。代码中的一个深层缺陷。
例如String.Length永远不会是负数,但它是有符号整数
但是String.IndexOf可以返回一个负数,如果String.Length和Index值不同的类型,它会很尴尬。
虽然理论上有一个无符号String.Length(4 GB上限)的优点,但实际上即使当前的2GB也足够大(因为这个长度的字符串很少见且不可行)。
所以真正的答案是:为什么首先使用无符号?
答案 4 :(得分:0)
关于第二个计数:因为他们希望CLR与没有无符号数据类型的语言兼容(读取:VB.NET)。