我在C#
的背景下提问。为什么Int64
和UInt64
的大小相同,即64-bits
。同样也适用于其他Int变量。
我希望UInt
的尺寸至少要小一些,因为它不需要代表-
符号,我在这里期待一些不合逻辑的东西吗?
答案 0 :(得分:9)
64
中的Int64
和UInt64
表示整数的大小为64位。这就是为什么它们的大小相同。
size 是相同的,但范围是不同的(也是由于有效位):
答案 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)