为什么不经常使用无符号变量?

时间:2009-01-29 01:51:50

标签: c# .net

似乎无符号整数对方法参数和类成员非常有用,它们永远不应该是负数,但我没有看到很多人以这种方式编写代码。我自己尝试过,发现需要从int转换为uint有点烦人......

无论如何你对此有什么看法?

复制

  

Why is Array Length an Int and not an UInt?

12 个答案:

答案 0 :(得分:6)

这个想法,即unsigned会阻止你处理那些不应该处理负值的方法/成员的问题,这有点有些缺陷:

  • 现在你必须检查大值('溢出')以防出错
    • 而您可以使用签名
    • 检查< = 0
  • 在您的方法中只使用一个带符号的int,并且您回到正方形“签名”:)

处理位时使用无符号。但是今天不要使用比特,除非你有很多这样的比特,它们填满了几兆字节或者至少你的小嵌入式内存。

答案 1 :(得分:4)

使用标准版可能会避免转换为无符号版本。在你的代码中,你可以保持区别好,但很多其他输入和第三方库不会,因此演员会让人疯狂!

答案 2 :(得分:3)

我不记得C#是如何进行隐式转换的,但在C ++中,扩展转换是隐式完成的。无符号被认为比签名更宽,因此这会导致意想不到的问题:

int s = 5;
unsigned int u = 25;
// s > u is false

int s = -1;
unsigned int u = 25;
// s > u is **TRUE**! Error error!

在上面的例子中,s溢出,所以它的值将是4294967295之类的。这之前我遇到了问题,我经常有方法返回-1来说“不匹配”或者类似的东西,并且隐式转换它只是没有做我认为应该做的事情。

经过一段时间,程序员学会了几乎总是使用签名变量,除非在特殊情况下。这些天的编译器也会为此发出警告,这非常有用。

答案 3 :(得分:3)

一个原因是引用无符号类型的公共方法或属性不符合CLS。

您几乎总是会看到此属性应用于.Net程序集,因为默认情况下各种向导都包含它:

[assembly:CLSCompliant(true)]

所以基本上如果您的程序集包含上面的属性,并且您尝试在公共接口中使用外部世界的无符号类型,则会出现编译错误。

答案 4 :(得分:2)

没有实际需要。声明一些没有签名的数字应该是正面的,这是一个可怜的勒芒尝试验证。

事实上,只有一个代表所有数字的数字类别会更好。

要验证数字,您应该使用其他技术,因为通常约束不仅仅是正数,而是设定范围。通常最好使用最无约束的方法来表示数字,然后如果要更改允许值的规则,则更改JUST验证规则而不是类型。

答案 5 :(得分:2)

为简单起见。现代软件涉及足够的演员阵容和转换。坚持尽可能少的常用数据类型可以降低合适接口的复杂性和模糊性。

答案 6 :(得分:1)

未记录的数据类型是从memomry溢价的过去开始的。所以现在我们并不真的需要它们。将它与铸造相结合,它们有点麻烦。

答案 7 :(得分:1)

不建议使用无符号整数,因为如果你为它分配负值,那么所有的地狱都会失败。但是,如果你坚持以正确的方式进行操作,请尝试使用Spec#,将其声明为整数(您将使用uint)并附加一个不变量,表示它永远不会是负数。

答案 8 :(得分:0)

你是对的,因为使用uint来做永远不会消极的事情可能会更好。但实际上,有几个理由反对它:

  • int是'标准'或'默认',它背后有很多惯性。
  • 你必须在任何地方使用烦人/丑陋的显式转换才能回到int,毕竟你可能需要做很多事情。
  • 当你转换回int时,如果你的uint值会溢出它会发生什么?
  • 很多时候,人们使用int来表示永远不会消极的东西,然后使用-1或-99或类似的东西来表示错误代码或未初始化的值。也许这有点懒惰,但这也是uint不太灵活的事情。

答案 9 :(得分:0)

最大的原因是人们通常过于懒惰,或者没有足够的思考,知道他们认为合适的地方。像size_t这样的东西永远不会是负数,所以unsigned是正确的

从签名到无符号的转换可能会充满危险,因为底层架构如何处理符号位的特殊性。

答案 10 :(得分:-1)

你不应该手动施放它,我不认为。

无论如何,这是因为对于大多数应用来说,无关紧要 - 两者的范围都足以满足大多数用途。

答案 11 :(得分:-1)

这是因为它们不符合CLS,这意味着您的代码可能无法按预期在其他.NET框架实现上运行,甚至在其他.NET语言上运行(除非支持)。

如果您尝试传递它们,它也无法与其他系统互操作。就像Java要使用的Web服务,或者调用Win32 API

请参阅SO post原因