今天做实验遇到了题目中的这些问题,感觉这种东西一直都没能很好的弄清楚。
下面一一列举:
1.int 转为 short 符号变化
<span style="white-space:pre"> </span>int i = 0x8001 ;
short si = (short)i ;
printf("int i = %d , short i = %d\n",i,si) ;
结果为
int i = 32769 , short i = -32767
由于short为16位数,故当int型的数据第16位为1时,就理所当然的被认为是负数了。而0x8001转为10进制就是-(2^16 -1) = -32767 ;
2.类型转换优先级
接上面的例子:
int iii = (short)i/1024 ;
结果为-31 。及先进行了强制转换,变为负的short,则 1000 0000 0000 0001 首先右移10位 ,为 1111 1111 1110 0000 ,注意符号位为1不变,右移左边补1,转为十进制就是-31 ;然后再默认转换位int,不变。
int iii = (short)(i/1024) ;
以上结果为32.先做了除法运算。
故由上有优先级:() > ( cast ) > /
3.按位与 和相等 优先级
0x01 & 0x10 == 0x0
结果位false,因为 == 优先级 高于 & ,故先做 == ,为 0 ,再与,为 0 ;
((0x10 & 0x01) == 0x0)
加上括号才ok啊。
同理有 '==' / '>=' / '>' /'<' / '<=' 优先级高于 & / | 等
最后附上全部优先级(来自http://zhidao.baidu.com/question/89746356.html):
一共有十五个优先级: 1 () [] . -> 2 ! ~ -(负号) ++ -- &(取变量地址)* (type)(强制类型) sizeof 3 * / % 4 + - 5 >> << 6 > >= < <= 7 == != 8 & 9 ^ 10 | 11 && 12 || 13 ?: 14 = += -= *= /= %= |= ^= &= >>= <<= 15 , 就着多吧 结合性:2 13 14 是从右至左 其他都是 从左至右