打印
[ZLG-ARM]

ADS中定义char,unsigned char,signed char的区别??

[复制链接]
3036|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
有意思|  楼主 | 2007-1-30 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定义一个字符指针:
char *msg = "21IC电子工程师社区";              //正确
unsigned char *msg = "21IC电子工程师社区";     //报错
signed char *msg = "21IC电子工程师社区";       //报错

这3种定义在ADS编译时,只有第1种通过,下面2种都会报错:错误提示:
Error   : C3028E: <initialisation>: implicit cast of pointer to non-equal pointer
LPC_LCD.c line 2406   

为啥啊,不明白,

相关帖子

沙发
有意思|  楼主 | 2007-1-30 19:13 | 只看该作者

to楼上的

char=signed char??
那么我在定义signed char *msg = "21IC电子工程师社区";       //报错
为什么同样报错,
在使用char、unsigned char和signed char定义时,只有char编译通过,另外两种都报错,何解??

使用特权

评论回复
板凳
zlgARM| | 2007-1-31 08:26 | 只看该作者

RE

测试:
在ADS编译器里,signed char和 char类型是不一样的。
楼主请做个实验,设置两个全局变量,分别为char类型和signed char类型,然后把这两个变量都赋“-1”,然后在AXD里察看这两个变量的值。结果并不一样。

背景知识:
ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char。。
char相当于signed char或者unsigned char,但是这取决于编译器。这三种字符类型都是按照1个字节存储的,可以保存256个不同的值。
signed char取值范围是 -128 到 127
unsigned char 取值范围是 0 到 255

但是char究竟相当于signed char呢还是相当于unsigned char呢??
这就是char和int的不同之处。int==signed int,但是char不能简单以为就==signed char

要确定char究竟等同什么要基于不同的编译器做测试。

使用特权

评论回复
地板
有意思|  楼主 | 2007-1-31 12:28 | 只看该作者

to楼上的

按照楼上的意思:
char = unsigned char  or  signed char取决与编译器,这个我我知道,也就是说,在一个编译器中,char要么==signed char,要么==unsigned char,

但问题是,我两者都试用了,只有在定义char时编译都过,unsigned和signed都报错,这用怎么解释???

使用特权

评论回复
5
zlgARM| | 2007-1-31 13:54 | 只看该作者

RE有意思

说一下我的理解,仅供您参考。

在C语言语法层面,char、signed char和unsigned char根本就是三种不同类型。

不管你编译器是把char的数值范围是设定为==signed char还是==unsigned char,总之char和signed char是两种不同的类型。
因为类型不同,所以,不能将char*类型的指针赋给unsigned char*或signed char*。

但在编译器的实现层面上,它需要确定char的取值范围。这一点需要通过设置编译器来实现,比如ADS的设置开关就是在目标设置里的ARM C COMPILER里的CODE GEN中。

再举一个例子,int和signed int的区别就没有争议了。因为int就是signed int。

所以,只有在取值范围的意义上,才有char的取值范围非signed char即unsigned char的说法。无论取值范围为何,char都是和signed char、unsigned char不同的数据类型,不这样,就会出现悖论————想一下,假设ANSI C认为char就是unsigned char或signed char会出现什么后果?


使用特权

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

本版积分规则

79

主题

331

帖子

0

粉丝