【发布时间】:2010-10-21 10:10:16
【问题描述】:
我总是遇到使用int 来表示.Count 等内容的代码,即使在框架类中也是如此,而不是uint。
这是什么原因?
【问题讨论】:
我总是遇到使用int 来表示.Count 等内容的代码,即使在框架类中也是如此,而不是uint。
这是什么原因?
【问题讨论】:
UInt32 不是CLS compliant,因此它可能不适用于所有针对公共语言规范的语言。 Int32 符合 CLS,因此保证存在于所有语言中。
【讨论】:
int,在 c 中,被特别定义为处理器的默认整数类型,因此被认为是一般数值运算中最快的。
【讨论】:
Int32 值之间的算术差异的最小类型是Int32。要保持两个任意UInt32 值之间的差异[自然会有相同的“符号”],需要Int64。恕我直言,.NET 可能受益于 UInt31 类型,该类型可以隐式转换为 Int32。
只有当一个有符号和无符号值的和或乘积是一个大到足以容纳任一操作数的有符号类型,并且如果两个无符号值之间的差是一个大到足以容纳任何一个有符号值时,无符号类型才表现得像整数结果。因此,大量使用UInt32 的代码将经常需要将值计算为Int64。当操作数过大时,对有符号整数类型的操作可能无法像整数一样操作,但当操作数小时它们会表现得很好。即使操作数很小,对无符号类型的未提升参数的操作也会产生问题。例如,给定UInt32 x;,如果结果类型为x==0,则不等式x-1 < x 将失败,如果结果类型为Int32,则不等式x<=0 || x-1>=0 对于较大的x 值将失败。只有在 Int64 类型上执行操作时,才能支持这两种不等式。
虽然有时以不同于整数算术的方式定义无符号类型的行为很有用,但表示计数之类的值通常应该使用行为类似于整数的类型——无符号类型通常不这样做除非它们小于基本整数类型。
【讨论】:
如果该数字本质上确实是无符号的,那么我将其声明为无符号整数。但是,如果我只是碰巧使用了正数范围内的数字(暂时),那么我将其称为 int。
主要原因是:
只是想到的一些快速想法。
我曾经尝试非常小心并选择正确的未签名/签名,但我终于意识到它并没有真正带来积极的好处。它只会创造额外的工作。那么,为什么要通过混合和匹配来使事情变得困难。
【讨论】:
UInt32 不符合 CLS。 http://msdn.microsoft.com/en-us/library/system.uint32.aspx
我认为多年来人们得出的结论是,使用无符号类型并没有真正提供那么多好处。更好的问题是通过将 Count 设置为 UInt32 可以获得什么?
【讨论】:
使用int的另一个原因:
假设你有一个像这样的for-loop:
for (i = someList.Count - 1; i >= 0; i--) {
// Stuff
}
很明显,如果someList.Count 为零而unsigned,你就会遇到问题。
【讨论】:
0 - 1 不会在有符号整数类型上溢出,结果也很明确。
有些东西使用 int 以便它们可以返回 -1,就好像它是“null”或类似的东西。如果 ComboBox 没有选择任何项目,它将为其 SelectedIndex 返回 -1。
【讨论】:
一些旧库甚至InStr 使用负数来表示特殊情况。我相信要么是懒惰,要么是有负面的特殊价值。
【讨论】: