枚举变量的任意值

时间:2012-01-10 09:24:36

标签: c++ enums

有这段代码。

#include <iostream>
#include <climits>
enum e  {zero,one};
void main()
{
    e num=(e)INT_MAX;
    std::cout<<num;
}

是否由标准定义输出为2147483647?(条件sizeof(int)= 4字节)

6 个答案:

答案 0 :(得分:3)

没有;将整数转换为枚举时,仅当整数值在范围内时才指定枚举值。从标准:

  

7.2 / 10算术或枚举类型的表达式可以显式转换为枚举类型。该   如果值在枚举类型的枚举值范围内,则值不变;否则结果   枚举值未指定。

其中“范围”在7.2 / 7中以相当复杂的方式描述,并且基本上达到2^M-1的最小值,其不小于最大定义值。

允许编译器使用任何整数类型来表示枚举,只要它足够大以容纳所有枚举值;所以在这种情况下,可以使用比int更小的类型,例如char。此外,INT_MAX仅保证至少为32767。

答案 1 :(得分:2)

首先,不能保证INT_MAX是2147483647.其次,不能保证你的枚举将具有能够存储2147483647的基础类型,也不能保证存储INT_MAX的任何值。

现在,如果您想知道是否可以使用没有定义枚举数的值,则答案为“是”。您可以使用没有相应枚举器的值,只要该值适合枚举的范围即可。此范围中的最大值是最小的2 ^ n - 1,它大于或等于所有枚举数。在您的情况下,范围是[0,1],因此没有其他值可以以明确定义的方式使用。

在下面的代码中,枚举范围是[0,3],因此3是一个有效值,即使没有枚举器。

#include <iostream>

enum e  {zero,one,two};
void main()
{
    e num=(e)3;
    std::cout<<num; // will print "3"
}

如果没有带负值的枚举数,则范围中的最小值为0。如果存在具有负值的枚举数,则它取决于实现使用的表示。如果实现使用两个补码,那么 - (max + 1),否则它只是-max。基本上,如果有负值,则范围还有一位:)

#include <iostream>

enum e  {minus_one=-1,zero,one,two};
void main()
{
    e num=(e)-3;
    std::cout<<num; // will print "-3"
}

在C ++ 11中,如果要确保值可以表示,则可以明确指定基础类型:

#include <iostream>
#include <cstdint>

enum e : std::int32_t {zero,one};
void main()
{
    e num=(e)2147483647;
    std::cout<<num; // will print "2147483647"
}

答案 2 :(得分:0)

在C ++规范中找不到任何直接的explenation,但可以很容易地推断出来。 枚举的基础类型是编译时定义的。如果编译器发现enum e值很容易适合一个字节,则可以决定使其为char类型。

这意味着您将无法在此INT_MAX中存储enum

答案 3 :(得分:0)

枚举类型的有效枚举值范围在C ++工作草案第7.2节第7段中定义如下:

对于其基础类型已修复的枚举,枚举的值是基础类型的值。否则,对于枚举,其中emin是最小的枚举数且emax是最大的,枚举的值是bmin到bmax范围内的值,定义如下:令两个补码表示为K,一个为0补码或符号幅度表示。 bmax是大于或等于max的最小值(| emin |?K,| emax |)并且等于2 ^ M? 1,其中M是非负整数。如果emin是非负的,则bmin为零,否则为(bmax + K)。如果bmin为零,则大小足以容纳枚举类型的所有值的最小位字段的大小为max(M,1),否则为M + 1。可以定义具有未由其任何枚举​​器定义的值的枚举。如果枚举器列表为空,则枚举的值就像枚举具有值为0的单个枚举器一样。

将算术或枚举类型转换为枚举类型时,如果该值在枚举类型的枚举值范围内,则该值不会更改。否则,该值未指定。

为避免意外行为,要转换的值必须在枚举值范围内。此外,如果需要动态检查超出范围的值,则必须在转换之前完成。

答案 4 :(得分:0)

没有。 2147483647超出了此枚举的范围。

如果没有负枚举,则枚举的范围是0到2 ^ k - 1,其中2 ^ k是2的最小幂,所有枚举都在范围内。在这种情况下,那将是2 ^ 1。因此e的任何大于2的值都会使输出不确定。

答案 5 :(得分:0)

枚举arg的类型是整数。

enum e{zero, one} 

表示

int zero = 0; int one =1;

如果将INT_MAX分配给整数类型arg。

结果为2^31