枚举范围混乱

时间:2010-11-12 18:35:40

标签: c++ enums

如何查找枚举范围? 我有两个版本,当最低值为负时,它会有不同的说法.Stroustrup说

 enum e3 { min = -10 , max = 1000000 }; // range -1048576:1048575

但 C ++ Primer Plus第5版说

  

例如,如果最小的枚举数为-6,则下一次[2次减负号]的幂为-8,因此下限为-7

我很困惑哪个是正确的?

3 个答案:

答案 0 :(得分:4)

我认为两者都是正确的(不过请参阅下面的Primer的定义),具体取决于你想要的兼容性。正式的定义是

  

对于枚举,其中e min是最小的枚举数且e max是最大的,枚举的值是b min到b max范围内的基础类型的值,其中b min和b max分别是,可以存储e min和e max的最小位域的最小值和最大值。

对于负数,问题是我们使用什么样的表示。它的脚注说

  

在二合一机器上,b   max是大于或等于表格的最大值(abs(e min)-1,abs(e max))的最小值   2 M - 1;如果e是非负的则b为零,否则为 - (b + 1)。

如果您假设符号幅度或一个补码,则示例枚举的范围为-1048575:1048575。对于两个补码,你在负范围内得到一个。 Primer的定义缺少最大枚举值,所以我不确定它是如何达到下限-7的。如果您希望与其他实现最大程度地兼容,我会选择-1048575:1048575

答案 1 :(得分:2)

C ++标准说(§[dcl.enum] / 7):

  

否则,对于枚举,其中 e min 是最小的枚举数, e max 是最大的,枚举的值是 b min b min 范围内的值,定义如下:< / p>      

      
  • K 为2的补码表示....
  •   
  • b max 是大于或等于max的最小值(| e min | - < em> K ,| e max |)等于2 M - 1,其中 M 是一个非负整数。
  •   
  • b min 为零,如果 e min 为非负数且 - ( b < sub> max + K )否则。
  •   

例如,在第一种情况下,

  • e min = -10, e max = 1000000
  • 因此 b max ≥max(10 - 1,1000000)= 1000000
  • b max 必须是2 M - 1的形式,所以我们使用 M =20⇒ b max = 1048575
  • e min 为负数,因此 b min = - (1048575 + 1)= -1048576。

在第二种情况下,

  • e min = -6, e max =未指定
  • 因此 b max ≥max(6 - 1,未指定)= 5或更多
  • 如果未指定确实小于5,则 b max 必须为7, b min 是-8。
  • 但是,如果未指定的数字> 7,则范围会更宽。

因此,C ++ Primer不正确,因为它忽略了上限的影响。

答案 2 :(得分:0)

它们完全相同,仅使用不同的比例。要存储数字1000000,您需要20位,因此您的范围是-1048576到+1048575。要存储-6,您需要3位,因此您可以存储在这3位中的范围是-8到+7。