9

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

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

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

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

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

C/C++ 中无符号迭代的危险

有符号字长和索引

Edit2:好的,Matthew Flaschen 发布的线程中还有其他几个很好的理由:

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

4 回答 4

5

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

于 2010-06-17T08:38:14.847 回答
3

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

于 2010-06-17T08:43:15.520 回答
2

未签名不符合 CLS。

于 2010-06-17T08:33:53.217 回答
0

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

  值 = 字节 0 | (字节1*256) | (字节2*65536) | (字节3*16777216);

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

我不确定我是否真的看到现在设计的语言不包括比最长有符号整数类型短的所有类型的无符号版本的任何理由,其语义是所有整数(意思是离散数量数字,而不是任何特定类型) 完全适合最大有符号类型的操作将默认执行,就好像它们在该类型上操作一样。包含最大有符号类型的无符号版本会使语言规范复杂化(因为必须指定哪些操作必须适合有符号类型的范围,哪些操作必须适合无符号类型的范围),否则应该有设计一种语言没有问题,if (unsigned1 - unsigned2 > unsigned3)这样即使在unsigned2大于unsigned1[如果想要无符号环绕,则应明确指定if ((Uint32)(unsigned1 - unsigned2) > unsigned3)]。指定这种行为的语言肯定会比 C(鉴于其历史,这是合理的)、C# 或 vb.net 中存在的混乱有了很大的改进。

于 2012-07-10T16:43:56.527 回答