| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 13137 人关注过本帖
标题:关于uint8_t的问题
只看楼主 加入收藏
都都
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-7-3
收藏
 问题点数:0 回复次数:4 
关于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
missiyou
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:531
专家分:218
注 册:2007-10-9
收藏
得分:0 
感觉就像加密解密一样,r1 最c 反加密一下。r2在反c也就是解一下。
0x55取反。0x 二进制中,0变为1,所以有了,0x ff 在加上55取反,这样就有了,0xffaa
2008-08-01 10:52
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
- -

uint8_t是八位。
0x55是0101 0101
~c是 1010 1010即0xAA
注意第一个表达式,因为uint16_t是16位,根据C的扩展规则(其实就是隐式类型转换规则),c被扩展为16位,再和r1进行位运算:
0xFFFF & 0xFFAA(为什么会扩展为FF?因为最高位为1)
第二个式子,c同样被扩展为0xFFAA,但是这时c被强制类型转换为int8_t,高8位被截掉,最后剩下0xAA这八位,和r2做位运算,结果就是0xAA

明白否?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-08-01 11:02
都都
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
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
你这个程序加不加volatile都是一样。
但是在嵌入式arm环境下,通常有多个线程会操作一个变量,这时候加volatile就非常重要了。你也许会发现
int mysqrt(volatile int n)
{
    return n*n;
}
并不一定返回n的平方的。当然这是一个很极端的例子了。
2008-08-02 10:09
快速回复:关于uint8_t的问题
数据加载中...
 
   



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

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