标题:关于uint8_t的问题
取消只看楼主
都都
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-7-3
 问题点数:0 回复次数:1 
关于uint8_t的问题
刚刚做到一道例题,是关于编译器将uint8_t其实当成char处理的问题


#include "stdint.h"

volatile uint16_t r1, r2;

int main()
{
  volatile uint8_t c;
  
  r1 = r2 = 0xFFFF;
  c = 0x55;

  r1 &= ~c;

  r2 &= (uint8_t)~c;

}
结果r1为0xFFAA, r2为0x00AA,为什么有这种结果呢? 红字显示的括号里的uint8_t有什么作用。

另外问一下,Cast-Operanden,CAST是什么,在这里能起什么作用吗?

谢谢
搜索更多相关主题的帖子: int CAST volatile 例题 括号 
2008-08-01 05:37
都都
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-7-3
得分:0 
谢谢楼上两位的解答。
尤其谢谢Starwings83,这次又来帮忙了:))
你的解释没有错,但是我是在AVR单片机环境下运行的,所以或许和你说的不一样。

基础环境变量:
char 8 bits
int 16 bits

应用头文件stdint.h定义uint8_t


对程序又做了如下的改动,并得出结果。

#include "stdint.h"

volatile uint16_t r1, r2,r3,r4,r5;

int main()
{
  volatile uint8_t c;
  
  c = 0x55;
  r1 =0xFFFF&c; //r1结果为0x0055,这说明了,c被扩展为了0x0055,如果被扩展为了0xFF55则结果应为0xFF55
  r2=~c;//r2结果为0xFFAA
  r3=(uint8_t)~c;//r3结果为0x00AA  
  r4=r5=0xFFFF;
  r4 &= ~c;//r4结果为0xFFAA
  r5 &= (uint8_t)~c;//r5结果为0x00AA
}

前提说明: 虽然通过头文件stdint.h定义了uint8_t,但是编译器实际上是把它作为"char"来处理的。因为在这里的环境下并没有8位的整型存在,只有8位的字符型。当对定义为uint8_t的变量进行算术或者逻辑操作时,其实是在对char型的变量进行操作。对字符型变量进行计算或者逻辑操作先要把8位的char转成16位的int(即从0x55->0x0055),然后再进行下面的运算。

这里依序解释上面的结果:
c=0x55;
r1 =0xFFFF&c; //r1结果为0x0055
对c进行逻辑与运算,因为c为char型,因此要转成16位int才能进行运算,
c: 0x55->0x0055  r1=0xFFFF&0x0055=0x0055

r2=~c;//r2结果为0xFFAA
c: 0x55->0x0055 r2=~c=0xFFAA

r3=(uint8_t)~c;//r3结果为0x00AA  
r3=(uint8_t)r2, 0xFFAA->0xAA->0x00AA,

到这里r4,r5也不用解释了。

我想大概应该是这样,初学者对很多东西还是不懂的。比如一直到现在都不知道volatile是干什么的,比如在这个程序里为什么一定要加volatile呢?

[[it] 本帖最后由 都都 于 2008-8-2 05:55 编辑 [/it]]
2008-08-02 05:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-226250-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.939826 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved