我想完全理解C ++编译器如何处理超过最大数量的枚举,即同时包含-1
和UINT64_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
仍然被广泛使用,我想了解这里会发生什么。
答案 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