Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 枚举范围混乱_C++_Enums - Fatal编程技术网

C++ 枚举范围混乱

C++ 枚举范围混乱,c++,enums,C++,Enums,如何找到枚举的范围? 我有两个版本,当最低值为负值时,它们的表述是不同的 enum e3 { min = -10 , max = 1000000 }; // range -1048576:1048575 但是 C++底漆加上第五版的 例如,如果最小的枚举数是-6,那么下一次的二次幂[乘以减号]是-8,因此下限是-7 我不知道哪一个是正确的?我相信这两个都是正确的(尽管Primer的定义见下文),这取决于您希望的兼容性。形式定义是 对于e min为最小枚举数且e max为最大值的枚举,枚举的值

如何找到枚举的范围? 我有两个版本,当最低值为负值时,它们的表述是不同的

 enum e3 { min = -10 , max = 1000000 }; // range -1048576:1048575
但是 C++底漆加上第五版的

例如,如果最小的枚举数是-6,那么下一次的二次幂[乘以减号]是-8,因此下限是-7


我不知道哪一个是正确的?

我相信这两个都是正确的(尽管Primer的定义见下文),这取决于您希望的兼容性。形式定义是

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

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

在二元补码机上,b max是大于或等于max(abs(e min)的最小值− 1,表中的abs(e max 2米− 1.如果e为非负,则b为零,且− (b+1)否则


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

它们是完全相同的语句,只是使用不同的比例。要存储数字1000000,您需要20位,所以您的范围是-1048576到+1048575。若要存储6,则需要3位,因此在3位中存储的范围为-8至+7。

< P> C++标准称:(<DCL,EnUM/7):

否则,对于emin为最小枚举数且emax为最大枚举数的枚举,枚举值为范围bmin至bmin内的值,定义如下:

  • 设K为2的补码表示的1
  • bmax是大于或等于max的最小值(| emin |− K、 | emax |)且等于2M− 1,其中M是非负整数
  • 如果emin为非阴性且−(b最大+K)否则
比如说第一种情况,

  • emin=-10,emax=1000000
  • 因此bmax≥ 最高(10− 1000000)=1000000
  • bmax的形式必须为2M− 1,所以我们使用M=20⇒ bmax=1048575
  • emin为负值,因此bmin=−(1048575 + 1) = −1048576
在第二种情况下

  • emin=-6,emax=未指定
  • 因此bmax≥ 最高(6− 1,未指定)=5或更多
  • 如果未指定的值确实小于5,那么bmax必须为7,bmin为-8
  • 但是,如果未指定的数字大于7,则范围将更宽

因此,C++引物是不正确的,因为它忽略了上界的影响。

我不知道这个信息在什么方面有用(比如范围)?即使在读了斯特劳斯塔普书中的“神秘”解释之后,我也不知道如何使用这些信息。