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++引物是不正确的,因为它忽略了上界的影响。我不知道这个信息在什么方面有用(比如范围)?即使在读了斯特劳斯塔普书中的“神秘”解释之后,我也不知道如何使用这些信息。