我正在阅读Bjarne S.的C ++编程语言 在页77,第4.8节我发现:
“枚举器可以通过constantexpression初始化 (§C.5)整数型(§4.1.1)。该 枚举的范围保存所有枚举的枚举器值四舍五入到最近 较大的二进制功率减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)
答案 0 :(得分:1)
这应该是你的版本中的拼写错误。在我的同一本书的版本(The C ++ programming langage - special edition,12th printing,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的两个最小幂可以是-16。但该句子必须与范围由能够保持值的 最小位域 定义的事实相关联。因此,您需要20位+符号位,并且根据约定,您可以使用此表示-2 ^ 20到+ 2 ^ 20-1的值。