c 整型提升和算数转换

来源:互联网 发布:野火微博软件 编辑:程序博客网 时间:2024/05/17 06:51

相关概念说明:

 

1:整型提升

如果char、short int或者int型位段(bit-field),包括它们有符号或无符号变型,以及枚举类型,可以使用在需要int或者unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。这称为整型提升。

2:寻常算术转换

许多操作数类型为算术类型的双目运算符会引发转换,并以类似的方式产生结果类型。它的目的的产生一个普通类型,同时也是运算结果的类型。这个模式成为“寻常算术转换”。

 

当两个类型长度不同时,短的类型根据自己是正数还是负数进行位扩展,然后按较长的类型解释signed或unsigned因为短类型向长类型扩展后无论解释成什么类型都不会丢失信息,而长类型本身为unsigned,若解释为signed肯定要丢失信息,所以要以长类型为准解释signed或者unsigned。

说明:虽然32位下long和int都是4个字节,但是int要向long转(可以当做long比int长)。

当两个类型长度相同,signed类型不同时(比如int和unsigned int),按照unsigned解释(即都转为unsigned)。因为两个同为类型相同,unsigned的转为signed肯定要丢失高位信息。

说明:这里不包括char,unsigned char,short,unsigned short,因为这些在一起会发生整形提升(扩展后,解释为signed int)。

                    

 --------------------------------------------------------------------------------------------从博客lvyilong316转载,按自己的理解修改了一部分--------------------------------------------------------------

以程序为例说明整型提升和算数转换:

void main()

{  

    chara = -1;

    unsignedchar b = -1;

   

printf("%u\n",a);

    printf("%u\n",b);

printf("%d\n",a>b); 

    printf("%d\n",a>(unsigned int)b);

    printf("%d\n",(unsigned int)a>b);

}

 

 

 

1:在机器中以补码形式存储。

    a 是一个负数,表示为 0xff;(8位)

b是一个无符号数,所以-1被解释为 0xff(正数)

 

当进行比较的时候,整型提升(扩展后,解释为signed int),由于计算机中数值一律用补码表示。位拓展时(32位机器) 

a的拓展位添1, 为 0xffff ffff;

b 的拓展位添0,为 0x0000 00ff;

 

2:printf("%d\n", a>b);

此时只有整型提升,a和b都被解释为unsignedint  ,输出的比较结果为0.

 

3:当b或者a中任意一个强制转换为unsignedint时候,此时除了整型提升,还要进行算数转换,(因为操作符的两个操作数属于不同类型)。根据寻常算数转换规则signed int类型的要转换为unsigned int ,此时 a则被解释为一个很大的数。通过printf("%u\n", a);可以看出,远大于b的值。

 

所以语句   printf("%d\n",a>(unsigned int)b);

           printf("%d\n",(unsigned int)a>b);

比较表达式 a>b  输出的结果都为1.

 

运行结果如下:


0 0
原创粉丝点击