使用uint vs int

时间:2010-06-22 18:07:08

标签: c#

我已经观察过一段时间C#程序员倾向于在任何地方使用int,并且很少使用uint。但我从来没有找到一个令人满意的答案。

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

在C ++中,如果你有一个负值没有意义的整数,你可以选择一个无符号整数。

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

然而,当混合int和单位类型时,需要额外的照顾和演员表。

是否应该使用更多?为什么呢?

11 个答案:

答案 0 :(得分:72)

int的输入时间比uint短。

答案 1 :(得分:48)

我怀疑,您对BCL中未使用uint的原因的观察是主要原因。

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

我还怀疑这在C#开发中并不常见,即使C#是唯一使用的语言,主要是因为它在BCL中并不常见。一般来说,开发人员试图(谢天谢地)模仿他们构建的框架的样式 - 在C#的情况下,这意味着尝试使您的API(公共和内部)看起来尽可能像.NET Framework BCL。这意味着谨慎使用uint。

答案 2 :(得分:18)

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

  • 不适用于公共API(因为uint不符合CLS)。
  • 您不需要负数。
  • 您(可能)需要额外的范围。
  • 与<{1}}进行比较时,

  • 与<{1}}进行比较时,

最后一项要求经常被遗忘,并会引入错误:

< 0

答案 3 :(得分:12)

1)坏习惯。认真。即使在C / C ++中也是如此。

考虑常见的for模式:

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

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

2)int被视为机器的本机类型。

答案 4 :(得分:4)

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

我同意uint未被充分利用,我鼓励其他人更多地使用它。

答案 5 :(得分:1)

我在较低级别的应用程序层编程,其中int很少超过100,因此负值不是问题(例如对于i&lt; myname.length()类型的东西)它只是一个旧的C习惯 - 并且更短的类型正如刚才提到的。但是,在某些情况下,当我处理来自设备的事件标志的硬件时,uint在标志可能使用左(最高)位的情况下很重要。

老实说,99.9%的工作我可以很容易地使用ushort,但是int,你知道,听起来听起来比ushort好很多。

答案 6 :(得分:1)

我在C#&amp; amp;做了一个Direct3D 10包装器。如果我想创建非常大的顶点缓冲区,则需要使用uint。视频卡中的大缓冲区无法用signed int表示。

UINT非常有用&amp;是不好说的。如果有人认为只是因为他们从未需要使用uint而没有其他人会这样做,那你就错了。

答案 7 :(得分:0)

我认为这只是懒惰。 C#本身就是台式机和其他具有相对较多资源的机器的开发选择。

然而,C和C ++在旧系统和内存稀疏的嵌入式系统中有着深厚的根源,因此程序员习惯于仔细考虑使用哪种数据类型。 C#程序员很懒,而且由于总体上有足够的资源,没有人真正优化内存使用(一般情况下,当然并不总是如此)。事件如果一个字节就足够了,很多C#程序员,包括我,只是为了简单起见使用int。此外,许多API函数接受整数,因此它可以防止强制转换。

我同意选择正确的数据类型是一种很好的做法,但我认为主要的动机是懒惰。

最后,选择一个整数在数学上更正确。数学中不存在无符号整数(仅自然数)。由于大多数程序员都有数学背景,因此使用整数更自然。

答案 8 :(得分:0)

我认为其中很大一部分原因是,当C首次出现时,为了简洁起见,大多数示例使用int。我们很高兴不必像使用Fortran和Pascal一样编写integer,而且在那些日子里我们经常将它们用于数组索引和循环计数器等普通事物。无符号整数是大数字的特殊情况,需要最后一个额外的位。我认为这是一种自然的进步,C习惯继续进入C#和其他新语言,如Python。

答案 9 :(得分:0)

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

其他语言(例如C)将N位无符号类型视为包围模2 ^ N的组。注意,从这样的组的成员中减去N不表示数字减法,而是产生组成员,当添加N时,将产生原始成员。可以说,涉及有符号和无符号值的混合的某些操作实际上没有意义,也许应该被禁止,但即使是像数字文字这样的规范的草率的代码通常也会起作用,并且编写了混合签名的代码和未签名的类型,尽管是草率的,但确实有效,规范不会很快改变。

使用签名类型专门工作比解决有符号和无符号类型之间的所有复杂错综复杂要容易得多。无符号类型在从较小的部分(例如序列化)中分解大数字或重构这些数字时很有用,但一般来说,最好只使用带符号的数字来表示实际代表数量的事物

答案 10 :(得分:0)

我知道这可能是一个旧帖子,但我想澄清一下。

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

主要原因是存储不是问题,您无法灵活地将其与其他软件,插件,数据库或Api一起使用。例如,银行也需要负数来存钱等。

我希望这会对某人有所帮助。