为什么Int64和UInt64大小相同

时间:2015-03-03 10:32:26

标签: c# .net

我在C#的背景下提问。为什么Int64UInt64的大小相同,即64-bits。同样也适用于其他Int变量。

我希望UInt的尺寸至少要小一些,因为它不需要代表-符号,我在这里期待一些不合逻辑的东西吗?

4 个答案:

答案 0 :(得分:9)

64中的Int64UInt64表示整数的大小为64位。这就是为什么它们的大小相同。

size 是相同的,但范围是不同的(也是由于有效位):

  • UInt64:0到18,446,744,073,709,551,615;
  • Int64:-9,223,372,036,854,775,808至9,223,372,036,854,775,807。

答案 1 :(得分:3)

这一切都归结为最重要的位用于。在签名数据中,它表示标志;在无符号数据中,只是另一个。这意味着无符号数据可以表示两倍大小的值,但只表示正值(和零) - 例如,在64位的情况下,无符号值为0到18,446,744,073,709,551,615 - 其中 - 有符号值为-9,223,372,036,854,775,808通过9,223,372,036,854,775,807。

更容易看到8位:-128到127对0到255.可能值的数量相同。

答案 2 :(得分:3)

根本原因是现代CPU是64-bit个。 因此实施起来要容易得多

  64-bit integer - one CPU register  (say RAX)
  32-bit integer - half CPU register (EAX)
  16-bit integer - 1/4 (AX)
   8-bit integer - 1/8 (AH)

否则(比如96-bit)你必须设计自己的支持,比如整数溢出检测等,这将是缓慢的。

答案 3 :(得分:1)

这里有C#的Integral Types Table。如果你看那里你可以看到:

  

长-9,223,372,036,854,775,808至9,223,372,036,854,775,807签名64位整数

     

ulong 0到18,446,744,073,709,551,615无符号64位整数

如果你看,两者的“范围”是相同的,2 ^ 64(包括0)

使用较小的数据类型可能更容易:

  

sbyte -128到127有符号8位整数

     

字节0到255无符号8位整数

两者都有256个值的“范围”,它们都是8位,2 ^ 8 == 256

请注意,有符号和无符号类型具有相同的值范围,因为历史上几乎所有处理器都使用two's complement来表示数字。如果他们使用ones' complement那么有符号数的有效范围将比无符号数的范围小1,因为将有两个0值(正0和负0)