免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1742 | 回复: 3

[C] 这个怎么解释?thx~~~ [复制链接]

论坛徽章:
0
发表于 2011-04-22 00:05 |显示全部楼层
#include <stdio.h>

int main()
{
        unsigned char a = 0xA5;
        unsigned char b = (~a) >> 4;
        printf("a=%d,b=%d\n",a,b);
        unsigned char c = 0xA5;
        unsigned char d = ~(c >> 4);
        printf("c=%d,d=%d\n",c,d);
        return 0;
}

请按 ENTER 或其它命令继续
a=165,b=245
c=165,d=245
首先a=165是不会变的,但是b怎么求
不添加括号,b=~a>>4; 答案也是跟上面一样;
1010 0101 右移4位 0000 1010 再求反 1111 0101 , 245
1010 0101 求反0101 1010 右移4位0000 0101  , 5

论坛徽章:
0
发表于 2011-04-22 08:54 |显示全部楼层
  1. unsigned char b = (unsigned char)(~a) >> 4;
复制代码

论坛徽章:
0
发表于 2011-04-22 08:54 |显示全部楼层
#include

int main()
{
        unsigned char a = 0xA5;
        unsigned char b = (~a) >> 4;
        printf("a=%d, ...
ljsdaya 发表于 2011-04-22 00:05



    ~a的时候,要经过整型提升到int,首先将a无符号扩展到0000 0000 0000 0000 0000 0000 1010 0101,然后按位求反成为1111 1111 1111 1111 1111 1111 0101 1010,然后因为~运算符的结果为int型,所以在移位时进行算术右移,高位补原位,故结果为1111 1111 1111 1111 1111 1111 1111 1010,然后截取低8位(就是1111 1010)赋值给b.

论坛徽章:
0
发表于 2011-04-22 13:24 |显示全部楼层
~a的时候,要经过整型提升到int,首先将a无符号扩展到0000 0000 0000 0000 0000 0000 1010 0101, ...
liwangli1983 发表于 2011-04-22 08:54



    感谢拉,,原来这里发生了整型提升!!!
移位之后是:1111 1111 1111 1111 1111 1111 1111 0101

这样: b=(~a) >> 4 ;应该等价于:b = ~a >> 4~~~过程你解释拉
而b = ~( a >> 4 ):过程:a算术移4位,0000 0000 0000 0000 0000 0000 0000 1010 ,然后求反,1111 1111 1111 1111 1111 1111 1111 0101 然后截低8位:1111 0101

这样说明并不是巧合的相等,而是总相等拉·~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP