为什么 Int64 和 UInt64 的大小相同
本文关键字:Int64 UInt64 为什么 | 更新日期: 2024-09-23 02:48:57
我在C#
的上下文中问。为什么Int64
和UInt64
的大小相同,即 64-bits
.其他 Int 变量也是如此。
我预计UInt
的尺寸至少会小一点,因为它不需要代表-
符号,我在这里期待一些不合逻辑的事情吗?
Int64
和 UInt64
中的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(