我知道标准说 a 的大小long integer
取决于实现,但我不知道为什么。
它需要做的就是能够存储 -2147483647 到 2147483647 或 0 到 4294967295。
假设 1 个字节是 8 位,那么这永远不需要超过 4 个字节。那么,是否可以肯定地说,只有一个字节少于 8 位时,一个长整数才会占用超过 4 个字节?或者还有其他可能吗?就像效率低下的实现浪费空间一样?
我知道标准说 a 的大小long integer
取决于实现,但我不知道为什么。
它需要做的就是能够存储 -2147483647 到 2147483647 或 0 到 4294967295。
假设 1 个字节是 8 位,那么这永远不需要超过 4 个字节。那么,是否可以肯定地说,只有一个字节少于 8 位时,一个长整数才会占用超过 4 个字节?或者还有其他可能吗?就像效率低下的实现浪费空间一样?
大于 32 位的一个明显用途long
是提供更大的可用范围。
例如,在long long int
(和公司)加入标准之前,DEC 销售 64 位 (Alpha) 处理器和 64 位操作系统。他们建立了一个(符合)系统:
char = 1 byte
short = 2 bytes
int = 4 bytes
long = 8 bytes
至于他们为什么这样做:嗯,一个明显的原因是他们的客户可以访问 64 位类型并利用他们的 64 位硬件。
额外的字节不会浪费空间。更大的范围非常有用。该标准指定了最小范围,而不是精确范围本身;拥有更广泛的类型并没有错。
当标准最初规定 anint
至少应为 16 位时,普通处理器的寄存器不会大于该值。代表一个long
拿了两个寄存器和特殊操作!
但后来 32 位成为标准,现在int
s 到处都是 32 位,long
s 是 64。现在大多数处理器都有 64 位指令,并且 along
通常可以存储在单个寄存器中。
你假设了很多事情:
CHAR_BIT
位宽PDP-10 的字节范围为 1 到 36 位。DEC VAX 支持对 128 位整数类型的操作。因此,有充分的理由超越标准的要求。
标准模板 std::numeric_limits (18.3) 的特化应指定实现的每种算术类型的最大值和最小值。
查找<limits>
标题。
您可能会对 Jack Klein 的这篇文章感兴趣!
如果您想要一个特定大小的整数,那么您想要使用具有指定大小的类型:
int8_t int16_t int32_t int64_t int128_t ...
这些在一些随机头文件中可用(它取决于您使用的操作系统,尽管在 C++ 中它似乎是 <stdint>)
您在开头使用 au 的未签名版本(uint32_t)。
其他人已经回答了为什么大小会这样那样。
请注意,最新的 Intel 处理器也支持 256 位。多么浪费,嘿?!8-)
哦!time_t 也开始使用 64 位。在 2068 年,32 位的 time_t 将变为负数,并为您提供 1800 年末的日期......这是在一些事情上采用 64 位的一个很好的理由。
使用 8 字节整数的原因之一是能够处理超过 4 GB 的内存。IE。2^32 = 4 GB。2^64 = 嗯,很多!
就个人而言,我使用 8 字节整数在双浮点数上实现基数排序(将浮点数转换为整数,然后用它做一些不值得在这里描述的神奇事情。:))