##########这是不是C++Primer的一个错误##########

peter9606 2004-06-24 10:04:06
P387
在讲到参数类型转换的时候。
说到:枚举类型的实参被提升到下列第一个能够表示其所有枚举常量的类型:int,unsigned int,long 或unsigned long .
可是枚举常量中的内容能是int表示不了的么?
比如我这样定义 enum e {a,b,c=0x9999999999999};
事实上我这样定义肯定会被编译器检测出来有问题的。

不知道我的看法是否这正确
欢迎大家指正。


...全文
168 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
peter9606 2004-06-26
hoho 多谢执教 好像明白了
回复
mailxt 2004-06-25
你有病啊,不是告诉你0x9999999999999已经超出32位处理器的最大整数范围了吗,枚举类型的实参能提升到不支持的类型吗?
回复
peter9606 2004-06-25
对。就是这个意思,既然都是这样了那 书上的说法就是错误的拉
:枚举类型的实参被提升到下列第一个能够表示其所有枚举常量的类型:int,unsigned int,long 或unsigned long .
回复
qwertasdfg123 2004-06-25
编译器会产生一个警告

warning C4341: 'c' : signed value is out of range for enum constant



回复
mailxt 2004-06-25
你不懂E文吗?
warning C4341: 'c' : signed value is out of range for enum constant
数值超出了枚举常量的范围,已经超出了可表示的值的范围了,int,unsigned int,long 或unsigned long在32位的Windows平台上都是4字节,表示的数值范围大小是一样的,你还让他往哪儿提升啊?只有在16为环境下int和long才不同,int是2字节,long是4字节。
回复
xjp6688 2004-06-25
up
回复
peter9606 2004-06-25
楼上没有看清楚我的问题么?
回复
peter9606 2004-06-24
那按照书上说的应该自动转换为long 咯?

回复
mailxt 2004-06-24
你用的是64位处理器吗?你把0x9999999999999数一数,32位处理器处理的数据int最大不过是0xffffffff,你的枚举常量大到编译器无法识别了当然会出错。
回复
peter9606 2004-06-24
是不是偶的这个问题太简单了?
大家都不屑一顾呀?

郁闷。。。。
回复
peter9606 2004-06-24
不好意思
上面的 最后一句 func(unsigned int i) 是多余的 应该去掉。
回复
peter9606 2004-06-24
#include <iostream.h>
void func(char c){
cout << "func(char p)" << endl ;
}

void func(int i){
cout << "func(int i)" << endl ;
}

void func(unsigned int ui){
cout << "func(unsigned int i)" << endl ;
}

int main(){
enum e1{a,b,c=0x800000000000} ;
e1 enum1 = c ;

enum e2{a2,b2,c2=3} ;
e2 enum2 = a2 ;

func(enum1);
func(enum2);

getchar();
return 1;

}


比如这样的程序 在 Dev cpp下就不能通过编译。
在vc6下 也会有警告,而且输出的答案是:
func(int i) ----〉这里和预期的func(unsigned int i)显然不一样
func(int i)
func(unsigned int i)
回复
mailxt 2004-06-24
在32位windows平台下long和int是一样的,都是32位
回复
peter9606 2004-06-24
自己 up 一下
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告