C++枚举类型取值范围

·  阅读 222

C++的枚举底层其实是一个整数类型,这个整数类型称为该枚举值的的底层类型underlying type),这个整数类型的范围就是该枚举的取值范围。

怎么说?

有个概念很容易被忽略了,叫枚举基,当然C++11才有,它的语法在枚举中是这样定义的

枚举关键词 属性(可选) 枚举名(可选) 枚举基(可选) {枚举项列表(可选)}

枚举基格式:冒号(:),后随指某个整数类型,并且该类型作为该枚举类型的固定底层类型。

enum Color : unsigned char {
    red = 1,
    green,//2
    blue = 127,
    white ,//128
    yellow = 255
};
复制代码

此时unsigned char为该枚举类Color的固定底层类型,并且sizeof(Color)等于sizeof(unsigned char)

std::cout << sizeof(Color) << std::endl;
std::cout << sizeof(unsigned char) << std::endl;
复制代码

大小都为1个字节

Color枚举的取值范围也为unsigned char的取值范围0~255,将red改为-1,或者将yellow256都提示超出表示范围

Enumerator value evaluates to -1,which cannot be narrowed to type 'unsigned char'

enum Color : unsigned char {
    red = 1,
    green,//2
    blue = 127,
    white ,//128
    yellow = 255,
    black//这里会报错
};
复制代码

还有个比较意思的是,我们知道如果没有指定枚举项的常量值,那么它的值是会前一个值加1,比如greenred的值加1,white的值为blue的值加1,但是如果yellow下面还有个值black,但不指定值,这时会报错,因为unsigned char的范围只能在0~255之间,而black却应为256

so,C++枚举的取值范围就是它的底层类型(比如这里的unsigned char)的取值范围。

如果不指定枚举基,那么其底层类型就不确定,此时底层类型由实现定义的某个能表示所有枚举值的整数类型,此类型不大于int,除非枚举的值不能放入int或者unsigned int

但是如果我们使用枚举的常量项比较少,可以使用更少字节的整数类型类型来减少内存使用,虽然有点微不足道。

分类:
阅读
标签:
分类:
阅读
标签:
收藏成功!
已添加到「」, 点击更改