关于整型提升(1)

隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

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

注明:以上整形提升的概念与意义均摘抄于网络,并非本人原创

1.负数的整形提升: char c1 = -1; 变量c1的二进制位(补码)中只有8个比特位: 1111111 因为 char 为有符号的 char 所以整形提升的时候,高位补充符号位,即为1 提升之后的结果是: 11111111111111111111111111111111

2.正数的整形提升 :char c2 = 1; 变量c2的二进制位(补码)中只有8个比特位: 00000001 因为 char 为有符号的 char 所以整形提升的时候,高位补充符号位,即为0 提升之后的结果是: 00000000000000000000000000000001

3.无符号整形提升,高位补0

例子(1):
char a=3; char b=127; char c =a+b;应该输出多少呢?
3的补码:00000000 00000000 00000000 00000011
取低八位:00000011

127的补码:00000000 00000000 00000000 01111111
取低八位:011111111

c=a+b;(相加时要提升成整形)
将3整形提升后:00000000 00000000 00000000 00000011(高位补充符号位,为0)
将127整形提升后:00000000 00000000 00000000 01111111(高位补充符号位,为0)
相加后:00000000 00000000 00000000 10000010
取低八位:10000010

将C整形提升:11111111 11111111 11111111 10000010(高位补充符号位,为1)
C的原码:10000000 00000000 00000000 01111110
打印出结果为(-126)

例子(2):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdlio.h>
#include<stdlib.h>
int main() 
{    
char a = 0xb6;   
short b = 0xb600;  
int c = 0xb6000000;   
  if(a==0xb6)      
      printf("a");  
  if(b==0xb600)  
       printf("b");   
  if(c==0xb6000000) 
       printf("c");  
   system("pause");
   return 0;
 }

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

例子(3):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdlio.h>
#include<stdlib.h>
int main()
 {   
  char c = 1; 
      printf("%u\n", sizeof(c));   
      printf("%u\n", sizeof(+c));   
      printf("%u\n", sizeof(!c));  
      system("pause");
      return 0; 
 }

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值