unsigned 和 signed 混合运算总结

unsigned 和  signed 混合运算总是被问及,我这里总结一下。这里的几个情况:

1.同等数据宽度,只要出现 unsigned ,皆以unsigned 运算。

2. 同等符号前缀,自动转化为大位宽大数据范围处理,如 unsigned long long  和 unsigned int ,总以 unsigned long long 处理.

3.不同数据宽度且不同数据符号前缀:

   <1> unsigned shortint ,皆转化为 intint  a = -2;

 unsigned short = 1;

    a / b 等于 -2 ,因为以 int 计算;

    int a = 2;

    unsigned short = -1;

    a / b 等于 0,因为以int 算,unsigned short 转化为 int ,即为 65535,结果自然为0

   <2> unsigned intshort  ,皆为 unsigned int 运算;

    unsigned int a = +2 / -2;

    short b = 1 ;

    a / b 等于 2或者 0xFFFFFFFE,皆以 unsigned int 算;

    unsigned int a  = -2;

    short b = -1;

     a / b 等于0 ,分子小于分母

  <3> unsigned intlong ,皆按照 unsigned long 运算,严格来说是按照unsigned int;

     unsigned int a = 2;

     long b = -1 ; 

     a / b 为0 

     unsigned int a = -2;

     long b = 1;

     a / b 为 0xFFFFFFFE 

   <4> unsigned intlong long (__int64),皆按照 long long (__int64)处理

   <5> unsigned long longint ,皆按照 unsigned long long 处理

   <6 - n> .....

 

从这些情况,我们不难得出这样的结论,混合符号且混合位宽的数据之间运算,总是以大数据范围大位宽的量为准,再联想到 1.2情况,发现所有的情况都以大数据范围大位宽数为准。

得出的结论是:unsigned 或 signed 混和运算,以大数据大位宽量为准。

注意:验证的时候,不要用 printf 打印出来的数据为准,请反汇编对比。

 

     

   

      

posted @ 2013-10-11 23:10  moon_cat  Views(1358)  Comments(0Edit  收藏  举报