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

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

隐式类型转换
  • 隐式类型转换

    • 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 = 10;
int size = sizeof(+a) //size值是4
  • 例三
*******计算 (char)((char)127+(char)10) *******
127
0000 0000 0000 0000 0000 0000 0111 1111  (int)127的补码

10
0000 0000 0000 0000 0000 0000 0000 1010  (int)10的补码


(char)127 的补码为:0111 1111
(char)10  的补码为:0000 1010

由于进行((char)127+(char)10)算术运算,
所以需要整形提升后再运算:
(char)127 整形提升:
	0000 0000 0000 0000 0000 0000 0111 1111
(char)10  整形提升:
	0000 0000 0000 0000 0000 0000 0000 1010

((char)127+(char)10)0000 0000 0000 0000 0000 0000 0111 1111
 +  0000 0000 0000 0000 0000 0000 0000 1010
 ———————————————————————————————————————————
 =	0000 0000 0000 0000 0000 0000 1000 1001	

因为 变量需强转char类型,只能存储1个字节,
所以需要从结果中截取一个字节(8个比特位)的数据作为其结果。
也就是:1000 1001	
1000 1001 (补码)
1000 1000 (反码)
1111 0111 (原码) = -119

-----------------------------------------------------------
*******(int)((char)127+(char)10) *******
127
0000 0000 0000 0000 0000 0000 0111 1111  (int)127的补码

10
0000 0000 0000 0000 0000 0000 0000 1010  (int)10的补码


(char)127 的补码为:0111 1111
(char)10  的补码为:0000 1010

由于进行((char)127+(char)10)算术运算,
所以需要整形提升后再运算:
(char)127 整形提升:
	0000 0000 0000 0000 0000 0000 0111 1111
(char)10  整形提升:
	0000 0000 0000 0000 0000 0000 0000 1010

((char)127+(char)10)0000 0000 0000 0000 0000 0000 0111 1111
 +  0000 0000 0000 0000 0000 0000 0000 1010
 ———————————————————————————————————————————
 =	0000 0000 0000 0000 0000 0000 1000 1001	

因为 变量需强转int类型,需存储4个字节,
所以需要从结果中截取四个字节(32个比特位)的数据作为其结果。
也就是:0000 0000 0000 0000 0000 0000 1000 1001		
0000 0000 0000 0000 0000 0000 1000 1001	 (补码)
0000 0000 0000 0000 0000 0000 1000 1001	 (反码)
0000 0000 0000 0000 0000 0000 1000 1001	 (原码) = -119



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/790300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存