2010-06-17 83 views
8

在.Net中使用有符号数作为索引的基本原理是什么?无符号与有符号数作为索引

在Python中,您可以通过发送负数索引数组的末尾,但在.Net中并非如此。 .Net稍后添加这样的功能并不容易,因为它可能会在编制索引时使用特殊规则(是的,一个坏主意,但我想它会发生)破坏其他代码。

不是我曾经需要索引数组超过2,147,483,647的大小,但我真的不明白他们为什么选择有符号数。

难道是因为在代码中使用有符号数更正常吗?

编辑:我刚刚发现这些链接:

The perils of unsigned iteration in C/C++

Signed word lengths and indexes

EDIT2:好的,一对夫妇从螺纹马修•富兰琛其他充分的理由发布:

  • 历史原因是因为它是一种类似c的语言
  • Interop with c
+0

+1,优秀的问题。 – Blindy 2010-06-17 08:34:14

+1

请参阅[为什么Array.Length是一个int,而不是一个uint](http://stackoverflow.com/questions/6301/why-is-array-length-an-int-and-not-an-uint)。 – 2010-06-17 08:42:45

+0

可能的重复[为什么.NET在某些类中使用int而不是uint?](http://stackoverflow.com/questions/782629/why-does-net-use-int-instead-of-uint-in-某些类) – nawfal 2014-07-15 15:39:43

回答

3

为了简单,当然。你喜欢trouble做无符号整数的大小算术吗?

+1

一个非常好的和有效的点 – simendsjo 2010-06-17 08:57:40

+0

你发布的例子是一个糟糕的编程实践的完美例子。如果有人是这样一个业余编码员,甚至没有签名的整数将会把他从缓冲区中解救出来/超支。 – 2017-06-14 08:11:12

2

无符号不符合CLS。

+0

但是,微软提出的CLS规范是正确的?他们在这种情况下有最后的发言权,他们确实选择使用有符号数字。 – Blindy 2010-06-17 08:34:57

+1

@Bindy:我认为他们希望尽可能使CLS规范尽可能包容,并且并非所有的语言都支持无符号数字(例如VB6,即使VB6不是CLS语言,我想他们可能想增加互操作性)。 – 2010-06-17 09:11:02

+0

@Bindy:Java甚至没有签名。 – kizzx2 2011-04-27 05:53:57

4

使用低于0的值作为无效索引可能是长期以来的传统。像String.IndexOf这样的方法返回-1,如果找不到元素。因此,必须对返回值进行签名。如果索引 - 消费者需要无符号值,则必须a)检查并b)转换该值以使用它。使用带符号的索引,您只需要检查。

+0

看起来似乎合理,但这是我能想到的唯一例子。使用负数作为索引是运行时错误。 IndexOf可以通过其他方式实现。 – simendsjo 2010-06-17 08:44:01

+0

另一个示例是[列表 .BinarySearch](http://msdn.microsoft.com/zh-cn/library/w4e7fxsh.aspx)其中,返回值是“排序列表中项目的从零开始的索引,if item是否被找到;否则,是一个负数,它是大于item的下一个元素的索引的按位补码,或者如果没有更大的元素,则为Count的逐位补码。 – 2010-06-27 20:20:46

0

无符号数字的主要用处在于从较小数字组成较大数字时出现,反之亦然。例如,如果一个从连接接收四个无符号字节,希望把自己的值,作为一个整体,作为一个32位整数,使用无符号类型是指一种可以简单地说:

 
    value = byte0 | (byte1*256) | (byte2*65536) | (byte3*16777216); 

相比之下,如果字节被签名,像上面这样的表达式会更复杂。

我不确定我真的看到任何原因,现在设计的语言不包括所有类型的无符号版本,比所有最长的有符号整数类型都短,其语义是所有整数(意味着离散数量数值比任何特定类型)完全符合最大签名类型的操作将默认执行,就好像它们正在以该类型操作。包含最大签名类型的未签名版本会使语言规范复杂化(因为必须指定哪些操作必须适合签名类型的范围,哪些操作必须适合在无符号类型的范围内),但除此之外应该有即使unsigned2大于unsigned1 [如果有人想要无符号环绕,人们会明确指定if ((Uint32)(unsigned1 - unsigned2) > unsigned3)],if (unsigned1 - unsigned2 > unsigned3)也会产生“数值上正确”的结果。一种规定这种行为的语言肯定会比C中存在的混乱(有理,鉴于它的历史),C#或vb.net有了很大改进。