整形提升详解

为什么要进行整形提升?

表达式的相应的整型运算要在CPU相关的运算器件内执行,CPU中的整型运算器的操作数的字节长一般就是int的字节长度,因此通过CPU是很难实现其他比特位字节的相加运算,所以,表达式中各种长度小于int的整型值都必须先转换成int或unsigned int,然后再送入CPU进行运算。

例子:

char a, b, c;

.....

c = a + b;

b和c的值会被提升为普通整形,然后再进行加法运算。

加法运算完成后,会根据c的类型进行截断,然后存储于a中。

如何进行整形提升?

整形提升是按照变量的数据类型的符号位来提升的

//正数的整形提升

char c1 = 5

变量c1的二进制位只有8个比特位:

补码:0000 1011

char 默认为有符号的char

所以整形提升的时候,高位补充符号位,即1

0000 0000 0000 1011

//负数的整形提升

char c1 = -5

变量c1的二进制位只有8个比特位:

补码:1111 1011

char 默认为有符号的char

所以整形提升的时候,高位补充符号位,即1

1111 1111 1111 1011

        注:无符号的整形提升,高位补0即可

上面直接讲规则太过于枯燥,下面就举几个例子来试试水:

实例1: 

int main()
{
    char a = 0xb6;      //0000 0000 0000 0000 1011 0110
    short b = 0xb600;   //0000 0000 1011 0110 0000 0000
    int c = 0xb6000000; //1011 0110 0000 0000 0000 0000
    if (a == 0xb6)
        printf("a");
    if (b == 0xb600)
        printf("b");
    if (c == 0xb6000000)
        printf("c");
    return 0;
}

实例1中的a,b要进行整形提升,但是c不需要整形提升 a,b整形提升之后,变成了负数,所以表达式
a==0xb6 , b==0xb600 的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真.
所程序输出的结果是: c
 

以a为例子:

 实例2:

int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}

实例2中的,c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节。表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof(c) ,就是1个字节。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值