有这段代码。
#include <iostream>
#include <climits>
enum e {zero,one};
void main()
{
e num=(e)INT_MAX;
std::cout<<num;
}
是否由标准定义输出为2147483647?(条件sizeof(int)= 4字节)
答案 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