打印

uint8型和uint16型的数怎么位运算?

[复制链接]
16477|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
老郑电子|  楼主 | 2011-1-28 10:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
老郑电子|  楼主 | 2011-1-28 10:48 | 只看该作者
本帖最后由 老郑电子 于 2011-1-28 10:49 编辑

#include <stdio.h>

int  main(void)
{
        unsigned double p1=0x000000ff,event;
        unsigned char prio=0x11;
       
        event=(prio<<16)|p1;
        printf("%x \n",event);

        return 0;
}

使用特权

评论回复
板凳
老郑电子|  楼主 | 2011-1-28 10:52 | 只看该作者
这个运行的结果是:event=0x1100ff;
为什么会这样呢?
double占4个字节。
char 占1个字节。

为什么prio左移16位后,相当于0x110000了。相当于变成24位的了。。书上不是讲它左移不是高位溢出,低位添0吗。移位后还是8位的。。这里移位后怎么变成24位的了。。/???????????????

使用特权

评论回复
地板
nevsayno| | 2011-1-28 10:53 | 只看该作者
prio是8位的数据,左移16位早就移空了。
另外double型的数据参与位运算,没见过这么用的。

使用特权

评论回复
5
老郑电子|  楼主 | 2011-1-28 10:56 | 只看该作者
这只是验证性的举例。。用double和int型的一样的。。

使用特权

评论回复
6
老郑电子|  楼主 | 2011-1-28 10:58 | 只看该作者
prio是8位的数据,左移16位早就移空了。
另外double型的数据参与位运算,没见过这么用的。
nevsayno 发表于 2011-1-28 10:53


prio是8位的数据,左移16位是移空了。。
但是,结合到这个语句,        event=(prio<<16)|p1;  这个语句运行后,event的值等于 0x1100ff;  那不是相当于prio左移16位变成24位的数据:0x110000和p1按位与 的结果吗??

使用特权

评论回复
7
yewuyi| | 2011-1-28 10:59 | 只看该作者
你想做什么位运算!?

位与?位或?位取反?位清零?位置一?

unsigned double p1=0x000000ff,event;
        unsigned char prio=0x11;
        
        event=(prio<<16)|p1;
        printf("%x \n",event);

这个程序中一个是浮点,一个无符号字符型,如此写法很容易出问题,请根据自己的需要先做强制转换后再做运算。

使用特权

评论回复
8
yewuyi| | 2011-1-28 10:59 | 只看该作者
建议LZ好好补补基础知识,这都是C语言的基础知识,而且还是那些比较容易掌握的基础知识。

使用特权

评论回复
9
老郑电子|  楼主 | 2011-1-28 12:11 | 只看该作者
你想做什么位运算!?

位与?位或?位取反?位清零?位置一?

unsigned double p1=0x000000ff,event;
        unsigned char prio=0x11;
        
        event=(prio
yewuyi 发表于 2011-1-28 10:59

uCOS_II里面的信号量的发送请求函数里面就有一个uint8型的prio优先级变量和一个uint16型的变量位运算。。
所以,我才这样问。。

使用特权

评论回复
10
老郑电子|  楼主 | 2011-1-28 12:16 | 只看该作者
好吧]]这样写吧]]

unsigned int  temp=0x00ff,event;
unsigned char prio=0x11;

event=(prio<<8)|temp;

这个的运算结果是:event=0x11ff;
这是为什么呢?
prio是8位的,而temp是16位的。这两个怎么位运算。。运算结果是怎么得来的呢?

使用特权

评论回复
11
yewuyi| | 2011-1-28 13:10 | 只看该作者
unsigned int  temp=0x00ff,event;
unsigned char prio=0x11;

event=(prio<<8)|temp;

这个的运算结果是:event=0x11ff;
----------------------------------------------
这有什么为什么的?prio被强制类型转换了而已。prio被扩展为uint16的字长,移位后成为0x11uu

使用特权

评论回复
12
老郑电子|  楼主 | 2011-1-28 13:22 | 只看该作者
哦==哥哥,谢谢了哈=

使用特权

评论回复
13
diweo| | 2011-1-29 10:25 | 只看该作者
如果CPU是32位的,语法上就没有问题。
prio<<16,是把prio对应的内存中的内容复制出来再左移,prio本身并没变。
event=(prio<<16)|p1结果是0x1100ff,但prio本身还是0x11。

只要不超过机器字长,移多少位都没关系。超过了当然就被截掉了,就失去意义了。

使用特权

评论回复
14
救火车| | 2011-1-29 10:46 | 只看该作者
如果是51单位片机,可以直接进行位操作。其他类型的只能按楼上几位说的做。

使用特权

评论回复
15
devan1918| | 2011-2-18 17:07 | 只看该作者
简单的,往往很容易忽略的

使用特权

评论回复
16
nan_banqiu| | 2011-2-18 21:49 | 只看该作者
学习了

使用特权

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

本版积分规则

0

主题

56

帖子

1

粉丝