无符号与带符号数作为索引

时间:2010-06-17 08:30:45

标签: .net unsigned signed indexing

在.Net中使用带符号数作为索引的理由是什么?

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

并不是说我曾经需要索引大小超过2,147,483,647的数组,但我真的不明白他们选择签名数字的原因。

是否可以因为在代码中使用带符号的数字更为正常?

编辑:我刚刚找到这些链接:

The perils of unsigned iteration in C/C++

Signed word lengths and indexes

Edit2:好的,Matthew Flaschen发布的帖子还有其他几个很好的理由:

  • 历史原因,因为它是一种类似c的语言
  • 与c
  • 互操作

4 个答案:

答案 0 :(得分:4)

使用低于0的值作为无效索引可能是一个悠久的传统。如果找不到元素,String.IndexOf等方法返回-1。因此,必须签署返回值。如果index-consumers需要无符号值,则必须a)检查并b)转换值以使用它。使用签名索引,您只需要检查。

答案 1 :(得分:3)

当然简单。你喜欢trouble使用无符号整数进行大小算术吗?

答案 2 :(得分:2)

无符号不符合CLS。

答案 3 :(得分:0)

无符号数的主要用途是在从较小数字组成较大数字时产生,反之亦然。例如,如果一个从连接接收到四个无符号字节,并希望将它们的值(作为一个整体)视为32位整数,则使用无符号类型意味着可以简单地说:

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

相比之下,如果字节是有符号的,那么上面的表达式会更复杂。

我不确定我是否真的认为现在设计的语言没有任何理由不包括比最长有符号整数类型更短的所有类型的无符号版本,语义都是整数(意味着离散数量 - 数字,而不是完全符合最大签名类型的任何特定类型的操作将默认执行,就像它们在该类型上操作一样。包括最大签名类型的无符号版本会使语言规范复杂化(因为必须指定哪些操作必须符合有符号类型的范围,哪些操作必须符合无符号类型的范围),否则应该有设计语言没有问题,即使if (unsigned1 - unsigned2 > unsigned3)大于unsigned2unsigned1也会产生“数字正确”的结果[如果有人想要无符号环绕,则会明确指定{{1} }}]。指定此类行为的语言肯定会比C中存在的混乱(有理由,有其历史),C#或vb.net有很大改进。