打印

请问怎么修改枚举成员的类型

[复制链接]
5302|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alphal|  楼主 | 2009-5-24 22:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MDK下,我在一个枚举类型中定义一个成员的值为0x8000 0000,编译器报溢出,估计枚举类型成员默认是signed char类型。

我的问题是:怎样能修改枚举类型中成员的类型?比如将默认的signed char改为unsigned char类型。
这里不考虑定义宏,常数来代替在枚举中定义这样一个参数的方法。即我就是想将这个0x8000 0000定义到枚举类型中。

另外:用GCC编译,就不会报错。

相关帖子

沙发
呆板书生| | 2009-5-25 17:03 | 只看该作者

这样试一下


enum TimeofDay:unsigned char
  { 
  Morning, 
  Afternoon, 
  Evening 
  } 

书上是这样说,我还没有试过

使用特权

评论回复
板凳
alphal|  楼主 | 2009-5-25 17:13 | 只看该作者

行不通。。。。

MDK编译,报错。
error:#110:expected either a definition or a tag name.
呵呵,四不像。

使用特权

评论回复
地板
alphal|  楼主 | 2009-5-25 17:33 | 只看该作者

奇怪。。

MDK中,我这样定义:
typedef enum 
{
  PIN0_BIT  = 0x00000001,
  PIN2_BIT  = 0x00000020,
  。。。。。。
  PIN30_BIT = 0x40000000,
  PIN31_BIT = 0x80000000
}hwpinBitNumber_t;
它警告枚举成员值超过int范围。

但这样定义它就报hwpinBitNumber_t没有定义:
enum hwpinBitNumber_t
{
  PIN0_BIT  = 0x00000001,
  PIN2_BIT  = 0x00000020,
  。。。。。。
  PIN30_BIT = 0x40000000,
  PIN31_BIT = 0x80000000
};
奇怪,教材上举例都是这样定义的,怎么这里就不行,用GCC编译也不行,难道我这里定义错了????

使用特权

评论回复
5
mohanwei| | 2009-5-25 17:58 | 只看该作者

让它是负数就可以了,很常用的做法

使用特权

评论回复
6
ayb_ice| | 2009-5-25 20:41 | 只看该作者

枚举一般都是有符号数

使用特权

评论回复
7
highgear| | 2009-5-25 22:27 | 只看该作者

枚举的类型是 int

如果编译器使用16bit的int, 则不能使用 32bit的枚举值。

使用特权

评论回复
8
alphal|  楼主 | 2009-5-25 22:48 | 只看该作者

那就是不能改它的默认的int的类型了?

使用特权

评论回复
9
alphal|  楼主 | 2009-5-25 23:18 | 只看该作者

to mohanwei :

0x8000 0000写成负什么?
我看内存-0x8000 0000就是0x80000000,但还是报溢出。

使用特权

评论回复
10
mohanwei| | 2009-5-26 09:34 | 只看该作者

0x80000000等于-2147483648

你在编译器里写几行代码测试一下也可以
        long L;
    L=0x80000000;//-2147483648
    L=0x80000001;//-2147483647
        ……
        L=0xffffffff;//-1

使用特权

评论回复
11
alphal|  楼主 | 2009-5-26 10:25 | 只看该作者

to mohanwei :

0x80000000的10进制数是-2147483648。

我在MDK中定义一个signed int的变量,分别赋值,编译出来仿真,看到是
0x80000000 :0x80000000
-0x80000000:0x80000000
-0x80000001:0x7FFFFFFF
负数在机器中按补码存储。

但这好像还是不能解决我的问题:
0x80000000作为枚举的成员会报int类型溢出。
写-0x80000000(在内存中看就是0x80000000)也报溢出。
按你说的"让它是负数",不知道你指的是什么办法,怎么定义,怎么使用?我以为是写成负数,好像不行。
我用的MDK编译,Armcc V3.1.0.934。

使用特权

评论回复
12
mohanwei| | 2009-5-26 11:10 | 只看该作者

十六进制前面极少会加负号的……

使用特权

评论回复
13
mohanwei| | 2009-5-26 12:24 | 只看该作者

查看的时候在观察窗口点右键选择十进制,就可以看到效果

使用特权

评论回复
14
alphal|  楼主 | 2009-5-26 13:53 | 只看该作者

看到效果了

但问题没有解决。

你说的"让它是负数",要怎么做?

使用特权

评论回复
15
mohanwei| | 2009-5-26 16:23 | 只看该作者

有这时间你真应该随便找本C/C++的书看一下基础

枚举可以赋值,然后下一个值加1:
enum ErrorTypeEnum
{
//电源类
_Power_Error=-2147483648,
_Voltage_Error, //-2147483647
_Current_Error, //-2147483646
//...

_Normat=0,

//...

};

使用特权

评论回复
16
alphal|  楼主 | 2009-5-26 16:41 | 只看该作者

....

我没有翻书,因为按你所说的用PIN31_BIT = -2147483648赋值,我放到程序中一编译就报警告,问题还是最开始的问题,这些我上面已经描述过了。

不知道你用的什么开发环境,我用MDK,用Armcc V3.1.0.934编译就有这样的问题,而用GCC编译就没有警告。
有空你也可以把你的方法在程序中编译一下试试。

使用特权

评论回复
17
mohanwei| | 2009-5-26 17:21 | 只看该作者

这个警告可以不用管的,大概意思是超出了int的表示范围

需要用long long来表示……(估计是你那个编译器的开发者犯了经典的“多1少1”错误)
实际上值还是正确的。

使用特权

评论回复
18
alphal|  楼主 | 2009-5-26 17:27 | 只看该作者

。。。。

我说的就是这个警告的问题,我想把这个警告消除。

首先想到的办法是改枚举成员的类型,若是unsigned int就不会有警告了,但是没改成功,不知道怎么改了。

使用特权

评论回复
19
mohanwei| | 2009-5-26 17:32 | 只看该作者

特意用mdk里的hellworld例子测试了一下:

enum ErrorTypeEnum
{
//电源类
_Power_Error=-2147483648,
_Voltage_Error, //-2147483647
_Current_Error, //-2147483646
//...

_Normat=0,

//...

};


int main (void)  { 
  int i=_Power_Error;//此处可以看到i真的是-2147483648,切换成16进制可以看到0x80000000
  while(i--)
      ;

编译警告是:Hello.c(17): warning:  #1134-D: literal treated as "long long"

但是把-2147483648改成-2147483647就没有了,显然是编译器的低级错误(但是不影响使用)

使用特权

评论回复
20
alphal|  楼主 | 2009-5-26 21:52 | 只看该作者

确实-2147483647就没有警告了

奇怪,难道真的是bug?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

112

主题

473

帖子

1

粉丝