Chinaunix首页 | 论坛 | 博客
  • 博客访问: 704874
  • 博文数量: 96
  • 博客积分: 2110
  • 博客等级: 大尉
  • 技术积分: 1018
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-23 19:36
文章分类

全部博文(96)

文章存档

2013年(2)

2012年(17)

2011年(77)

分类: C/C++

2011-03-10 18:18:46

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     unsigned char a = 0xA5;
  5.     unsigned char b = ~a>>4;
  6.     printf("b = %d\n", b);
  7.     return 0;
  8. }

 

以下是解题过程:

这题目主要考虑两点:1、类型转换 2、优先级

首先根据自动类型转换原则:a必须先转化为int型,以提高运算的精度。也成整型提升。(隐式转化)

a:    0000 0000 0000 0000 0000 0000 1010 0101

~a:    1111 1111 1111 1111 1111 1111 0101 1010

~a>>4: 1111 1111 1111 1111 1111 1111 1111 0101

然后将结果赋值给unsigned char类型的b

最后在prinf()中,又将b转换为int型,0000 0000 0000 0000 0000 0000 1111 0101

这里我还想解释下在进行右移的时候高位补得是“1111”,那表明这个右移是算数右移。

我一直以为是这个是逻辑右移(被unsigned char a给迷惑了)。因为当类型自动转换后,a为int类型,一般默认情况int是signed的。我是这么理解的。

 

移位相关知识:

算数移位相对于有符号数,而逻辑移位相对于无符号数。

算数左移和逻辑左移相同,都是空缺处补0

算数右移空缺处补上符号位。

逻辑右移空缺处补上0

还有C语言没有设计循环移位。但是可以通过位运算来实现。

 

类型转换相关知识:

在C语言中,整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用)。如果一个运算符两侧的操作数的数据类型不同,则系统按先转换、后运算原则,首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。

图中横向向左的箭头表示必须的转换。charshort 型必须先转换成 int 型,float型数据运算时首先要转换成double型,以提高运算的精度。                       

纵向向上的箭头表示当对象为不同类型数据时的转换方向。数据总是由低级别向高级别转换的。例如,int型与double型数据进行混合运算,则先将int型数据转换成double型,然后在两个同类型的数据间进行运算,结果为double型。

还有强制类型转换时候,得到的是一个所需类型的中间两,原来变量的数据类型并没有变化。

如(double)a,a的数据类型还是原来的,并没有转换为double。

阅读(1671) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~