枚举超过最大数字类型的大小

时间:2019-01-04 14:24:01

标签: c++ enums

我想完全理解C ++编译器如何处理超过最大数量的枚举,即同时包含-1UINT64_MAX的枚举,

enum A {
    X = -1,
    Y = UINT64_MAX
};

首先,我认为编译器不会接受此代码。实际上,当enum替换为enum class时,它不会编译,但是上面的示例可以编译。根据标准,我们可以使用以下类型:

  

声明一个无范围的枚举类型,其基础类型不固定(在这种情况下,基础类型是实现定义的整数类型,可以表示所有枚举器值;除非枚举器的值不能适合int或unsigned int。如果枚举数列表为空,则基础类型就像枚举有一个值为0的枚举数一样。 (https://en.cppreference.com/w/cpp/language/enum

但是对于我的示例,这意味着什么?

我编写了一个小示例程序来了解发生了什么:

#include <iostream>
#include <cstdint>

enum A {
    X = -1,
    XX = -1,
    Y = UINT64_MAX
};

int main()
{

    std::cout << "X unsigned: " << (uint64_t)(X) << ", signed: " << (int64_t)(X) << std::endl;
    std::cout << "Y unsigned: " << (uint64_t)(Y) << ", signed: " << (int64_t)(Y) << std::endl;

    std::cout << "(X == XX) == " << (X == XX) << std::endl;
    std::cout << "(X == Y) == " << (X == Y) << std::endl;
}

输出为:

X unsigned: 18446744073709551615, signed: -1
Y unsigned: 18446744073709551615, signed: -1
(X == XX) == 1
(X == Y) == 0

现在我很困惑。显然,X和Y表示相同的数字,但是它们仍然是可区分的,即比较X == Y为假(但X=XX实际上为真)。这里会发生什么?

我知道,更好的方法不是使用旧的enum,而是使用新的enum class。 但是enum仍然被广泛使用,我想了解这里会发生什么。

2 个答案:

答案 0 :(得分:10)

根据C ++标准,您的编译器最有可能使用128位带符号整数类型作为后备类型。

亲身体验

{{1}}

链接:DocumentationTool,输出16。

您观察到的输出与缩小到64位无符号类型的转换一致。

答案 1 :(得分:-1)

您看到的是类型转换的效果,而不是enum。您的输出取决于您如何转换值。

尝试一下:它的输出与您的输出相同,没有enum

#include <iostream>
#include <cstdint>

int main()
{

    std::cout << "X unsigned: " << (uint64_t)(-1) << ", signed: " << (int64_t)(-1) << std::endl;
    return 0;
}

输出为:

X unsigned: 18446744073709551615, signed: -1