整形提升和算术转换

整形提升

C的整型算术运算总是至少以缺省整型类型的精度来进行的。当两个小于int整形的的操作数在计算机中进行计算时,计算机为了获得精度会先将两个类型在计算前先转换为int的整形。

我们知道,字符型的所占空间大小是1个字节即8个比特位。那么假设有两个字符型类型的操作数在进行相加或相减时。会将这两个操作数先提升为一个int的整形大小即32个比特位进行运算。计算完之后再以8个比特位对这个结果进行截断。

那么举个例子:

#include<stdio.h>
int main()
{
    char a = 126;
    char b = 5;
    char c = a + b;
    printf("%d\n",c);

    return 0;
}

当两个操作数进行相加,变量c应该等于几?会不会是等于131?如果这么想那就错了,当代码运算之后打印的结果是: -125。

分析:计算机在运算时使用的是补码进行计算,当操作数进行运算时,使用的是补码,正数的原码和补码相同,但计算出来的还是补码,补码在需要打印时会先转换成原码的形式在进行打印。因为char小于int的4个字节,所以在计算时会发生整形提升,将char由8bit提升为32bit然后相加得到一个补码。再将补码转换成原码以整形(32bit)的形式打印出来。

所以整形提升是一个比较坑的点,稍不留意就掉到坑里了。如果这个char类型是一个无符号的unsigned char类型得到的就不是-125了,就是131。

算术转换

当小于int的类型在进行不同类型的计算时会发生整形提升,而当大于或等于int的不同类型要进行运算发生的就叫做算术转换了。

 当一个intunsigned int进行计算时,会先将int 通过算术转换为unsigned int,再与unsigned int计算,如果是一个整形在与浮点型进行计算会将整形先转换成浮点型再进行计算。同类型的计算不会发生算术转换(不包括char和short)。

举例2:

注意:sizeof是不参与运算的。但表达式会有一个值属性和一个类型属性。一个double类型和int类型的进行计算,计算后的结果就是值属性,两个操作数一个是int类型,一个是double类型,就是类型属性,而sizeof会根据表达式来判断是否存在整形提升或算术转换,然后只需要推断下最后得到的类型是什么,最后计算大小就可以了。

#include<stdio.h>
int main()
{
    int a = 4;
    double b = 4.0f;
    printf("%d\n",sizeof(a+b));//8

    return 0;
}

 有用的小知识

证明:sizeof不进行运算:

下面代码为什么是2和20,其实就是sizeof内部只是模拟了一个计算过程,当a+b进行计算,虽然a会发生整形提升,但是最后的结果会截断之后再放到a的里面,所以sizeof计算得到的是一个short类型的大小,由于sizeof其实并没有真正的将a+b的结果放到a里面,所以a并没有改变,还是20。

可以理解为,sizeof只关心结果的值属性的类型大小,但不会真正的去进行计算。

#include<stdio.h>
int main()
{
    short a = 20;
    int a = 5;
    printf("%d\n",sizeof(a = a + b));//2
    printf("%d\n",a);//20

    return 0;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值