使用uint vs int

我已经观察了一段时间,C#程序员倾向于在任何地方使用int,很less诉诸于uint。 但是我从来没有发现一个令人满意的答案。

如果互操作性是您的目标,则uint不应出现在公共API中,因为并非所有CLI语言都支持无符号整数。 但是这并不能解释为什么整个国家如此盛行,即使是在内部阶级。 我怀疑这是在BCL中谨慎使用uint的原因。

在C ++中,如果你有一个整数的负值是没有意义的,你select一个无符号的整数。

这清楚地表明,负数不被允许或预期,编译器会为你做一些检查。 我也怀疑在数组索引的情况下,JIT可以轻松地删除下限检查。

但是,当混合int和单位types时,需要额外的护理和施放。

应该用更多的? 为什么?

你怀疑为什么不使用BCL是我怀疑的主要原因。

UInt32不符合CLS,这意味着它完全不适合在公共API中使用。 如果您要在您的私有API中使用uint,这将意味着将转换转换为其他types – 并且保持types相同通常更简单和更安全。

我也怀疑这在C#开发中并不常见,即使C#是唯一使用的语言,主要是因为它在BCL中不常见。 总的来说,开发人员试图(幸好)模仿他们正在构build的框架的风格 – 在C#的情况下,这意味着要尽可能使公共和内部的API看起来像.NET Framework BCL一样。 这将意味着谨慎使用uint。

inttypes比uint更短。

通常int就足够了。 如果您可以满足以下所有条件,则可以使用uint

  • 这不是一个公共API(因为uint不符合CLS)。
  • 你不需要负数。
  • 你(可能)需要额外的范围。
  • 你并没有把它与< 0进行比较,因为这是从来没有的。
  • 没有使用它与>= 0进行比较,因为这永远不会是false

最后的要求往往被遗忘,并会引入错误:

 static void Main(string[] args) { if (args.Length == 0) return; uint last = (uint)(args.Length - 1); // This will eventually throw an IndexOutOfRangeException: for (uint i = last; i >= 0; i--) { Console.WriteLine(args[i]); } } 

1)坏习惯。 认真。 即使在C / C ++。

考虑模式的共同点:

 for( int i=0; i<3; i++ ) foo(i); 

那里绝对没有理由使用整数。 你永远不会有负面的价值。 但几乎每个人都会这样做一个简单的循环,即使它包含(至less)两个其他“样式”的错误。

2) int被认为是机器的本机types。

除非负数实际上在可接受值的范围内,否则我更喜欢uint 。 特别是,如果数字小于零,接受一个int参数,但抛出一个ArgumentException只是愚蠢的 – 使用uint

我同意uint被滥用,我鼓励其他人更多地使用它。

我在一个较低的应用程序层进行编程,其中int很less超过100,所以负值不是问题(例如,对于i <myname.length()types的东西),它只是一个旧的C习惯 – 而且如上所述types更短。 但是,在某些情况下,当与设备处理事件标志的硬件连接时,如果标志可能使用左侧(最高)位,则uint非常重要。

老实说,99.9%的工作我可以轻松使用,但是,诠释,你知道,听起来好多了。

我在C#中创build了一个Direct3D 10包装器,如果我想创build非常大的顶点缓冲区,需要使用uint。 video卡中的大缓冲区不能用带符号的int表示。

UINT是非常有用的,愚蠢地说,否则。 如果有人认为只是因为他们从来不需要用别人的话,那么你错了。

我认为这只是懒惰。 C#本质上是在桌面和其他资源相对较多的机器上进行开发的select。

然而,C和C ++在内存稀less的旧系统和embedded式系统中有着深厚的根基,因此程序员习惯于仔细思考使用哪种数据types。 C#程序员是懒惰的,而且由于总体上有足够的资源,所以没有人真正优化内存使用(当然,并不总是)。 事件如果一个字节就足够了,包括我在内的很多C#程序员只是简单地使用int。 而且,很多API函数都接受ints,所以它可以防止cast。

我同意select正确的数据types是好的做法,但我认为主要的动机是懒惰。

最后,select一个整数在math上更正确。 math中不存在无符号整数(只有自然数)。 而且由于大多数程序员都有math背景,使用整数更自然。

我认为很大一部分原因是,当C首先出于简洁的原因使用int大部分例子。 我们喜欢不必像Fortran和Pascal那样编写integer ,在那些日子里,我们经常使用它们来处理数组索引和循环计数器等世俗的事情。 无符号整数是需要最后一位的大数字的特殊情况。 我认为这是一个自然的进展,C习惯继续使用C#和Python等其他新语言。

一些语言(例如许多版本的Pascal)将无符号types视为表示数​​字量; 通常会执行无符号types和相同大小的签名types之间的操作,就像操作数被提升到下一个更大的types一样(在某些这样的语言中,最大的types没有无符号的等价types,所以这样的提升总是可能的)。

其他语言(例如C)将N位无符号types视为以模2 ^ N为模的组。 请注意,从这样的一个组中减去N并不代表数字减法,而是产生组成员,当N被加到它时,将产生原始数据。 可以说,涉及有符号和无符号值混合的某些操作并不是真的有意义,也许应该被禁止,但是即使是像数字文字那样规范的代码通常也是可行的,并且代码已经被写入了混合签名和无符号的types,尽pipe是sl,的,确实工作,该规范不容易改变很快。

完全使用签名types比处理签名types和未签名types之间所有复杂的交互要容易得多。 无符号types在从较小的部分分解大数字(例如用于序列化)或重构这些数字时非常有用,但是通常最好使用有符号数字来表示实际表示数量的事物

我知道这可能是一个古老的线程,但我想澄清一下。

让我们可以存储-128到127,它使用1个字节,总共127个正数。
当你使用int8时,其中一个位用于负数-128。
当您使用Uint8时,您将负数赋予正数,因此您可以使用具有相同存储量1个字节的255个正数。
唯一的缺点是你现在失去了使用负值的能力。
这个问题的另一个问题不是所有的编程语言和数据库都支持这个
在我看来,唯一的原因就是当你需要在类似的游戏编程中高效的时候,你必须存储大的非负数。 这就是为什么没有很多程序使用它。

主要的原因是存储不是问题,你不能用其他软件,插件,数据库或Api来灵活使用它。 例如,银行也需要负数来存储货币等。

我希望这会帮助别人。