如何查找枚举范围? 我有两个版本,当最低值为负时,它会有不同的说法.Stroustrup说
enum e3 { min = -10 , max = 1000000 }; // range -1048576:1048575
但 C ++ Primer Plus第5版说
例如,如果最小的枚举数为-6,则下一次[2次减负号]的幂为-8,因此下限为-7
我很困惑哪个是正确的?
答案 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 )否则。
例如,在第一种情况下,
在第二种情况下,
因此,C ++ Primer不正确,因为它忽略了上限的影响。
答案 2 :(得分:0)
它们完全相同,仅使用不同的比例。要存储数字1000000,您需要20位,因此您的范围是-1048576到+1048575。要存储-6,您需要3位,因此您可以存储在这3位中的范围是-8到+7。