为什么 Int64 和 UInt64 的大小相同

本文关键字:Int64 UInt64 为什么 | 更新日期: 2024-09-23 02:48:57

我在C#的上下文中问。为什么Int64UInt64的大小相同,即 64-bits .其他 Int 变量也是如此。

我预计UInt的尺寸至少会小一点,因为它不需要代表-符号,我在这里期待一些不合逻辑的事情吗?

为什么 Int64 和 UInt64 的大小相同

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

大小相同,但范围不同(也是由于有效位(:

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

根本原因是现代 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(,你必须设计自己的支持,比如整数溢出检测等,这会很慢。

这一切都归结为最高有效位的用途。在有符号数据中,它指示符号;在无符号数据中,它只是另一个位。这意味着无符号数据可以表示量级两倍的值,但仅表示正值(和零( - 例如,在 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,更容易看到。可能值的数量是相同的。

这里有 C# 的整型类型表。如果你看那里,你可以看到:

long -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(

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

字节 -128 到 127 有符号 8 位整数

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

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

请注意,有符号和无符号类型具有相同的值范围,因为历史上几乎所有处理器都使用 2 的数字补码。如果他们使用了 1 的补码,那么有符号数的有效范围将比无符号数的范围少 1,因为将有两个 0 值(正值和负 0(