【问题标题】:C++ - Enumeration range? Bjarne Stroustrup bookC++ - 枚举范围? Bjarne Stroustrup 书
【发布时间】:2014-07-18 13:59:43
【问题描述】:

我正在阅读 C++ 编程语言 - Bjarne S.
在第 77 页,第 4.8 节我发现:

"一个枚举数可以被一个常量表达式初始化 (§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)

【问题讨论】:

  • 如果您有实际问题,您可以将其包含在您的帖子中。
  • 你说的准确吗?如果是这样,那似乎是错误的。也许min 应该是-10
  • 您应该提及您引用的版本。有多个版本。

标签: c++ enums


【解决方案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 的值。

【讨论】:

  • 我确实有一个旧版本。从 2000 年开始,但问题是该枚举的范围是什么?
  • 对不起!我以为你不明白,因为不匹配。我会在编辑中澄清
  • @victor 的附加解释答案是否阐明了您在哪里寻找?
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多