首页 > 代码库 > 位移 隐式类型转换小解

位移 隐式类型转换小解

例一:

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还很菜。如果有哪里有错的话,希望各路大神前辈同学后生娃子指出

 

位移 隐式类型转换小解