-
枚举类型的值占几个字节?
-
枚举值能否为负数?
-
枚举类型的值超过上限会怎样?
-
如果指定枚举类型占用字节数?
枚举类型占用字节数
#include <stdio.h>
enum {
A,
B
};
int main() {
printf("sizeof(A) = %d\n", sizeof(A));
return 0;
}
sizeof(A) = 4
编译运行,查看结果,可以得知默认情况枚举类型占用4个字节。
枚举类型能否负数
#include <stdio.h>
enum {
A = -1,
B
};
int main() {
printf("A = %d, B = %d\n", A, B);
return 0;
}
A = -1, B = 0
其实上面的代并不能完全可靠的推断枚举值支持负数,具体原因和补码有关。那么如何才能确定枚举值是支持负数呢?换种问法就是枚举类型是有有符号的还是无符号的?
这个答案也可以通过编译器得知:
$ gcc -Wsign-compare enum.c
enum.c: In function ‘main’:
enum.c:10:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(a < - 1) {
^
编译时候指定无符号和有符号数据进行比较时给出警告,可以看出与枚举值比较时并没有告警。
#include <stdio.h>
enum {
A = 1,
B
};
int main() {
unsigned int a = 1;
if(a < - 1) {
printf("unsigned int: Wrong type conversion 1 Less than -1!!!\n");
} else {
printf("unsigned int: ok\n");
}
if(A < - 1) {
printf("enum: Wrong type conversion 1 Less than -1!!!\n");
} else {
printf("enum: ok\n");
}
return 0;
}
unsigned int: Wrong type conversion 1 Less than -1!!! enum: ok
枚举值超过上限
#include <stdio.h>
enum {
A = 0xffffffff,
B
};
int main() {
printf("B = %lld\n", B);
return 0;
}
编译时候就可以知道这个代码是无法编译通过的,编译会报错。
error: overflow in enumeration values
指定枚举值点用字节
那么在64位机器上如果需要超过4字节上限的枚举值怎么办呢?其实可以在给枚举值赋值时候指定值的类型为 LL
:
#include <stdio.h>
enum {
A = 0xffffffffLL,
B
};
int main() {
printf("B = %lld\n", B);
printf("sizeof(B) = %d\n", sizeof(B));
return 0;
}
B = 4294967296 sizeof(B) = 8
总结
实际上关于枚举类型的标准是有符号还是无符号,并没有标准来规定,这是由具体实现决定的。