首页 > 代码库 > 位移 隐式类型转换小解
位移 隐式类型转换小解
例一:
int main()
{
unsigned char a = 0xa5;
unsigned char b = ~a >> 1+2+3;
printf("b = %d\n",b);
}
问b的值是多少?
这里b = 253;
老师说是先按位移再取反,说取反是和右加加一样的后置运算(本人新手不懂,~的运算级不是高些么):
1010 0101 >> 6 得 0000 0010 再取反 1111 1101(253)
小M看汇编代码得出的结果是这样的
1010 0101 扩展为16位(寄存器为16位)
0000 0000 1010 0101 取反优先得 1111 1111 0101 1010
再位移得 0000 0011 1111 1101 赋予b时截取前8位得 1111 1101(253)
如果 a 是 char a = 0xa5 最后b的值为1
按老师说的~后置运算
1010 0101 >> 6 得 1111 1110 取反得 0000 0001(1)
按小M的想法先扩展(隐式转换)
1111 1111 1010 0101 先取反 0000 0000 0101 1010
再位移 0000 0000 0000 0001 (1)也是1
现不确定那个是对的又或是都是对的,希望有前辈提点一下。
例二:
int main()
{
char *a = "China";
char *b = "American;
if(strlen(a) - strlen(b) > 0)
{
printf("China\n");
}
else
{
printf("American\n");
}
}
结果输出为 China;
这里strlen返回的是unsigned类型的,将发生隐式转换 因此 > 左边永远大于等于0
小M的小结:在开始进行运算时前会隐式转换所有的数据,直到在赋值操作时又进行一次转换
有符号转换为无符号,整形转换为浮点型。
小M还很菜。如果有哪里有错的话,希望各路大神前辈同学后生娃子指出
位移 隐式类型转换小解