C语言基础-隐式类型转换(整形提升)

隐式类型转换

  • 隐式类型转换

    • C的整型算数运算总是至少以缺省类型的精度来进行的

整型提升

为了获得这精度,表达式中的字符和短整型操作数在使用之前被转换为普通类型,这种转换被称为整型提升。

如何提升

先转换成其补码,然后按照数据类型的符号来提升的(除值外,其他值补符号位值)

-1	
1000 0001  原码
1111 1110  反码
1111 1111  补码
1111 1111 1111 1111 1111 1111 1111 1111 整形提升(补码)

何时需要整型提升

在进行short/char类型进行算术运算时,先进行整型提升,再进行算术运算。

意义

  1. 表达式的整形运算要在CPU的相应运算器件内执行,CPU内整形运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU通用寄存器的长度。
  2. 因此,即两个char类型相加,在CPU执行时实际上也要先转换CPU内整型操作数的标准长度.
  3. 通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须转为int或unsigned int,然后才能送入CPU去执行运算

例题:

  • 例题1
 //整型提升例题
   //00000011  a 的补码
   char a = 3;
   //01111111  b的补码
   char b = 127;
   
   // a + b 先将a 和 b转换成int型 
   //00000000 00000000 00000000 00000011  -(int类型) a
   //00000000 00000000 00000000 01111111  -(int类型) b
   //00000000 00000000 00000000 10000010  -(int类型) a+b
   //因为 变量“c”是char类型,只能存储1个字节,
   //所以需要从a+b的结果中截取一个字节(8个比特位)的数据作为变量”c“的值。
   //10000010 -(char类型) c
   char c = a + b;


   //因为需要以十进制的方式输出字符类型的c。需要整型提升。
   //10000010 因为符号位为1,所以按照符号位填充
   //11111111 11111111 11111111 10000010  -(int 类型) c   --补码  
   //11111111 11111111 11111111 10000001  -(int 类型) c   --反码  补码-1是反码  反码+1是补码
   //10000000 00000000 00000000 01111110  -(int 类型) c   --源码 
   // -126  c
   printf("%d" , c); 
  • 例二
char a 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值