C++中的枚举类型支持负数吗?取值范围是多少?

文章转载自:http://www.cctry.com/thread-289877-1-1.html

这其实是一个老生常谈的问题,之前的编程过程中也是经常的需要用到枚举类型,针对枚举类型的成员的值一般也是从0开始累加,也没太注意一些细节。
在咱们VC驿站的《实用C++》新手入门教程的第26课中,也给大家讲解了什么是枚举类型,详情地址在这里,新手可以过去温习下:
http://www.cctry.com/thread-289359-1-1.html

那么今天咱们就来讨论下,枚举类型中的成员的值到底支不支持负数?如果支持负数的话成员的取值范围又是多少呢?
针对这个问题我也到网上找了找资料,说什么的都有,有的说不支持负数,有的说支持。哎,真是说什么的都有,具体找C++的标准文档也暂时没找到,于是,今天咱们就自己试试吧,实践出真知嘛,对不对!

环境:Microsoft Windows 7 + Visual Studio 2013 With Update 5

我们添加如下一个枚举类型的测试代码:

  1. enum E32Test
  2. {
  3.         E32Test_1 = -5,
  4.         E32Test_2,
  5.         E32Test_3
  6. };

  7. int main(int argc, char* argv[])
  8. {
  9.         int var = E32Test_1;
  10.         cout << "var = " << var << endl;
  11.         return 0;
  12. }
复制代码


打印的结果如下图:
C++中的枚举类型支持负数吗?取值范围是多少? 
看到了吧, 看来枚举类型确实是支持负数的 。好,咱们的第一个问题解决了。

第二个问题,既然枚举支持负数的话,那么取值范围又是多少呢?我们再来测试一下,网上有的网友说枚举类型的取值范围就是带符号的 int 类型的取值范围,那么是不是呢?
默认 VS2013 中微软提供给我们一些事先定义好的宏,包含了各个类型的取值范围,都在 limits.h 文件中了。其中 32 位的 有符号的 int 类型的最大值就是:
  1. #define _I32_MAX      2147483647i32 /* maximum signed 32 bit value */
复制代码

最小值就是这个:
  1. #define _I32_MIN    (-2147483647i32 - 1) /* minimum signed 32 bit value */
复制代码


接下来,我们加上如下的测试代码:
  1. enum E32Test
  2. {
  3.         E32Test_0 = _I32_MIN,
  4.         E32Test_1 = -5,
  5.         E32Test_2,
  6.         E32Test_3,
  7.         E32Test_4 = _I32_MAX
  8. };

  9. int main(int argc, char* argv[])
  10. {
  11.         int var_min = E32Test_0;
  12.         int var_max = E32Test_4;
  13.         cout << "var_min = " << var_min << endl;
  14.         cout << "var_max = " << var_max << endl;
  15.         return 0;
  16. }
复制代码

编译正常通过,没有任何警告,之后我们执行程序,打印的结果如下图:
C++中的枚举类型支持负数吗?取值范围是多少? 

也是正确的哦,这里面正确不能说明最大值和最小值就是 _I32_MAX 和 _I32_MIN,我们再将枚举类型的代码改下:
enum E32Test
{
        E32Test_0 = _I32_MIN - 1,
        E32Test_1 = -5,
        E32Test_2,
        E32Test_3,
        E32Test_4 = _I32_MAX + 1
};

最小值再用 _I32_MIN - 1,最大值再用 _I32_MAX + 1,看看怎么样呢?
我们直接编译下源码,结果得到如下图警告:
C++中的枚举类型支持负数吗?取值范围是多少? 
所以 VS2013 就明确的告诉我们了,说这个 + 和 - 的操作都超出范围了。于是我们就可以确定, 枚举类型的最大和最小值就是 有符号的 int 类型的最大和最小值。

既然答案已经确定了,原本这次实践就应该结束了。但是我又转念一想,当前工程是Win32格式的,也就是说是 x86 体系的 32 位程序。如果我把工程改成 x64 位平台下的程序呢?枚举类型的最大最小值会不会变成 64 位平台下的 有符号的 int 类型最大和最小值呢?
我们不妨来继续实践下试试吧。

在当前工程的编译选项上添加 x64 位平台编译,如下图:
C++中的枚举类型支持负数吗?取值范围是多少? 

x64 位平台下的 有符号 int 整型的最大值和最小值的宏是:
  1. /* minimum signed 64 bit value */
  2. #define _I64_MIN    (-9223372036854775807i64 - 1)
复制代码

  1. /* maximum signed 64 bit value */
  2. #define _I64_MAX      9223372036854775807i64
复制代码


接下来,我们再定义一个针对 x64 位的枚举类型,代码如下:
  1. enum E64Test
  2. {
  3.         E64Test_0 = _I64_MIN,
  4.         E64Test_1 = -5,
  5.         E64Test_2,
  6.         E64Test_3,
  7.         E64Test_4 = _I64_MAX
  8. };
复制代码


编译,结果,直接报出了警告,如下图:
C++中的枚举类型支持负数吗?取值范围是多少? 

所以,我们得到的最终结论就是, 不管在 32 位平台下,还是在 64 位平台下,枚举类型的取值范围都是 32 位的有符号的 int 类型的最大最小值。

好了,答案已经有了。基本测试我们也都做完了,文章就到这里吧,相关的工程源码在附件中,感兴趣的童鞋可以下载学习。有什么疑问跟帖交流哦!
  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值