分类: C/C++
2011-03-10 18:18:46
以下是解题过程:
这题目主要考虑两点: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语言中,整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用)。如果一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则,首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。
图中横向向左的箭头表示必须的转换。char和short 型必须先转换成 int 型,float型数据运算时首先要转换成double型,以提高运算的精度。
纵向向上的箭头表示当对象为不同类型数据时的转换方向。数据总是由低级别向高级别转换的。例如,int型与double型数据进行混合运算,则先将int型数据转换成double型,然后在两个同类型的数据间进行运算,结果为double型。
还有强制类型转换时候,得到的是一个所需类型的中间两,原来变量的数据类型并没有变化。
如(double)a,a的数据类型还是原来的,并没有转换为double。