[ZLG-ARM] ADS中定义char,unsigned char,signed char的区别??

[复制链接]
3841|5
 楼主| 有意思 发表于 2007-1-30 15:28 | 显示全部楼层 |阅读模式
定义一个字符指针:<br />char&nbsp;*msg&nbsp;=&nbsp;&quot;21IC电子工程师社区&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//正确<br />unsigned&nbsp;char&nbsp;*msg&nbsp;=&nbsp;&quot;21IC电子工程师社区&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//报错<br />signed&nbsp;char&nbsp;*msg&nbsp;=&nbsp;&quot;21IC电子工程师社区&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//报错<br /><br />这3种定义在ADS编译时,只有第1种通过,下面2种都会报错:错误提示:<br />Error&nbsp;&nbsp;&nbsp;:&nbsp;C3028E:&nbsp;&ltinitialisation&gt:&nbsp;implicit&nbsp;cast&nbsp;of&nbsp;pointer&nbsp;to&nbsp;non-equal&nbsp;pointer<br />LPC_LCD.c&nbsp;line&nbsp;2406&nbsp;&nbsp;&nbsp;<br /><br />为啥啊,不明白,
 楼主| 有意思 发表于 2007-1-30 19:13 | 显示全部楼层

to楼上的

char=signed&nbsp;char??<br />那么我在定义signed&nbsp;char&nbsp;*msg&nbsp;=&nbsp;&quot;21IC电子工程师社区&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//报错<br />为什么同样报错,<br />在使用char、unsigned&nbsp;char和signed&nbsp;char定义时,只有char编译通过,另外两种都报错,何解??
zlgARM 发表于 2007-1-31 08:26 | 显示全部楼层

RE

测试:<br />在ADS编译器里,signed&nbsp;char和&nbsp;char类型是不一样的。<br />楼主请做个实验,设置两个全局变量,分别为char类型和signed&nbsp;char类型,然后把这两个变量都赋“-1”,然后在AXD里察看这两个变量的值。结果并不一样。<br /><br />背景知识:<br />ANSI&nbsp;C&nbsp;提供了3种字符类型,分别是char、signed&nbsp;char、unsigned&nbsp;char。。<br />char相当于signed&nbsp;char或者unsigned&nbsp;char,但是这取决于编译器。这三种字符类型都是按照1个字节存储的,可以保存256个不同的值。<br />signed&nbsp;char取值范围是&nbsp;-128&nbsp;到&nbsp;127<br />unsigned&nbsp;char&nbsp;取值范围是&nbsp;0&nbsp;到&nbsp;255<br /><br />但是char究竟相当于signed&nbsp;char呢还是相当于unsigned&nbsp;char呢??<br />这就是char和int的不同之处。int==signed&nbsp;int,但是char不能简单以为就==signed&nbsp;char<br /><br />要确定char究竟等同什么要基于不同的编译器做测试。<br />
 楼主| 有意思 发表于 2007-1-31 12:28 | 显示全部楼层

to楼上的

按照楼上的意思:<br />char&nbsp;=&nbsp;unsigned&nbsp;char&nbsp;&nbsp;or&nbsp;&nbsp;signed&nbsp;char取决与编译器,这个我我知道,也就是说,在一个编译器中,char要么==signed&nbsp;char,要么==unsigned&nbsp;char,<br /><br />但问题是,我两者都试用了,只有在定义char时编译都过,unsigned和signed都报错,这用怎么解释???
zlgARM 发表于 2007-1-31 13:54 | 显示全部楼层

RE有意思

说一下我的理解,仅供您参考。<br /><br />在C语言语法层面,char、signed&nbsp;char和unsigned&nbsp;char根本就是三种不同类型。<br /><br />不管你编译器是把char的数值范围是设定为==signed&nbsp;char还是==unsigned&nbsp;char,总之char和signed&nbsp;char是两种不同的类型。<br />因为类型不同,所以,不能将char*类型的指针赋给unsigned&nbsp;char*或signed&nbsp;char*。<br /><br />但在编译器的实现层面上,它需要确定char的取值范围。这一点需要通过设置编译器来实现,比如ADS的设置开关就是在目标设置里的ARM&nbsp;C&nbsp;COMPILER里的CODE&nbsp;GEN中。<br /><br />再举一个例子,int和signed&nbsp;int的区别就没有争议了。因为int就是signed&nbsp;int。<br /><br />所以,只有在取值范围的意义上,才有char的取值范围非signed&nbsp;char即unsigned&nbsp;char的说法。无论取值范围为何,char都是和signed&nbsp;char、unsigned&nbsp;char不同的数据类型,不这样,就会出现悖论————想一下,假设ANSI&nbsp;C认为char就是unsigned&nbsp;char或signed&nbsp;char会出现什么后果?<br /><br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

331

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部