[英]C++ - Enumeration range? Bjarne Stroustrup book
我正在阅读Bjarne S的C ++编程语言。
在页77,第4.8节中,我发现了这一点:
“可以通过整数类型(第4.1.1节)的常量表达式(第C.5节)来初始化枚举器。枚举的范围将所有枚举的枚举器值四舍五入到最接近的较大二进制幂减1.。如果最小的枚举数为非负数,则减小为0;如果最小的枚举数为负数,则减小为最接近的较小的负二进制幂。这定义了能够保存枚举数的最小位域。例如:
enum e1 { d a r k , l i g h t }; // range 0:1
enum e2 { a = 3 , b = 9 }; // range 0:15
enum e3 { m i n = 10 , m a x = 1 0 0 0 0 0 0 }; // range -1048576:1048575
我不明白为什么enum3具有该范围
(1048576:1048575)? -(-2 ^ 20:2 ^ 20-1)
这应该是您的刊物中的错字。 在同一本书的版本(C ++编程语言-特别版,第12版,2005年5月)中,我读了
enum e3 { min = -10, max = 1000000 };
与文本一致。
附加说明:
Stroustrup解释说,该范围基于能够保存枚举器值的最小位域 。 使用20位,您可以表示2 ^ 20 = 1048576个不同的值。 当您从0开始而不是从1开始计数时,可以转到最大值2 ^ 20-1。 这说明了最大范围。
现在,他解释说,如果最小的枚举数为非负数,则范围将降至0 。 这意味着,如果min = 10 ,则范围为0到1048575。
他还解释说, 如果最小枚举数为负 (适用于min = -10) ,则最小范围应四舍五入至最接近的较小的负二进制幂 。 仅这句话是不明确的:您可能认为-10以下的2的最小幂是-16。 但是该句子必须与以下事实相关:范围由能够保存值的最小位域定义。 因此,您需要20位+符号位,并根据约定可以用-2 ^ 20到+ 2 ^ 20-1的值表示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.