Int32和UInt32有什么区别?

22

Int32UInt32有什么区别?

如果它们的容量范围能力相同,那么问题就是为什么要创建UInt32?什么时候应该使用UInt32而不是Int32?


你知道有符号整数和无符号整数的区别吗? - Aryabhatta
@Moron:Yen,我知道。只是不小心把UInt32当作“未管理的int32”而不是“无符号int32”。哈哈!! - Fitzchak Yitzchaki
1
投票关闭为“过于局限”,因为这个问题只对认为UInt32意味着“非托管int32”的人有用。我认为已经没有这样的人了。 - John Saunders
@Jhon:我同意你的观点。 - Fitzchak Yitzchaki
5个回答

48

UInt32无法表示负数。来自MSDN:

UInt32值类型表示无符号整数,其值范围从0到2的32次幂或2 ** 32(相当于4,294,967,295)。


(2**32) -1 = 4294967295,因为你需要考虑到0,所以最大值需要减去1。 - Xylol

16

整数是-2147483648到2147483647之间的数字,而无符号整数是0到4294967295之间的数字。

这个文章可能会对你有所帮助。


11

uint32是一个32位无符号整数,这意味着您可以表示2^32个数字(0-4294967295)。

然而,为了表示负数,32位中的一位被保留用于表示正数或负数。这使您在负数和正数中各有2^31个可能的数字。结果范围是-2147483648到2147483647(正数范围包括值0,因此仅有2147483647)。这种表示称为int32

对于那些根据定义不能为负数的数字,应该选择无符号的类型,因为它提供了更广泛的范围,但需要记住的是,从int32转换到uint32或者反过来是不可能的,因为int32不能容纳uint32的范围,反之亦然。


2

uint32是无符号32位整数。它不能用于表示负数,但可以容纳更大的正数。


-4

它们之间没有区别。

区别在于它们的表示方式,例如通过打印到终端。

例如,为了简单起见,我们仍然使用8位值:

  • 255是0xff,-1也是0xff
  • 将-1解释为“零点左边的一个”,而+1则为“零点右边的一个”。
  • -1 + -1 = -2,即“零点左边的两个”,也是0xfe。好吧,如果我们将其转换为无符号数学,则变为0xff + 0xff = 0xfe。

因此,你看,有符号和无符号之间没有区别,只有最终表示它们的方式不同,在这种情况下,类型指示了它的表示方式。

当编译器必须通过符号扩展从较小的大小转换为较大的大小时,有符号性变得重要。因此,在这种情况下,指定类型很重要,以便编译器可以做正确的事情。


“它们之间没有区别”这种说法是完全错误的。有符号整数保留了1位用于确定一个数字是正数还是负数。无符号整数不保留此位,这意味着它们只能是正数而不能是负数。这一位的存在与否是一个巨大的区别,因为它将数字的最大值加倍,但代价是无法表示负数(我们使用2的幂,31^2等于4294967295)。 - dimitar.bogdanov
1
你非常自信。在寄存器级别上,无符号整数和有符号整数的存储方式没有区别。负数没有指定的位翻转。根据你提出的观点,-1是一个带有最高有效位设置的无符号数。这是非常错误的。-1是零减一,结果在8位架构中为0xFF。这样,当我们将正数加到0xFF时,结果为0。负数只是在底层映射到无符号数。在8位数学中,-1 + -2等于什么?0xff + 0xfe = 0xfd。这被称为二进制补码算术。 - Robby Wasabi
1
这个答案太被低估了,看到人们投票反对真是令人难过。不过我想再补充一个区别:编译器会在有符号类型上使用算术移位。 - Alessio Sangalli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接