VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 489|回复: 0

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

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-4-11 17:40:10 | 显示全部楼层 |阅读模式
这其实是一个老生常谈的问题,之前的编程过程中也是经常的需要用到枚举类型,针对枚举类型的成员的值一般也是从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 类型的最大最小值。

好了,答案已经有了。基本测试我们也都做完了,文章就到这里吧,相关的工程源码在附件中,感兴趣的童鞋可以下载学习。有什么疑问跟帖交流哦!

C++中的枚举类型支持负数吗?取值范围是多少? CMDTest.zip (10.43 KB, 下载次数: 1)




上一篇:《实用C++》第31课 类的成员函数
下一篇:求助,第22课作业不会了……

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-7-17 05:42

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表