C语言中隐式类型转换 截断和整型提升

发布于:2025-02-15 ⋅ 阅读:(139) ⋅ 点赞:(0)

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

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

给出代码实例↓

#include<stdio.h>
int main()
{
	//char = signed char
	char a = 3;
	char b = 127;
	char c = a + b;
	printf("%d", c);
	return 0;
}

正常来说结果为130 但是运行结果为什么是↓

 

为什么呢  这就牵扯到了整形提升(针对二进制的序列补码)

所谓的整形提升分为 有符号的 和 无符号的整形

对于有符号的最高位是0就补0 , 1就补1

无符号的全都补0

先从a看起3的普通整形是(4个字节)

a:00000000000000000000000000000011

但是a的类型是char (一个字节)此时就会发生截断保留后面八个比特位

a:00000011

b也是同样的原理 截断后

b:01111111

运算时 a,b会被提升为普通整形(32比特位)再进行运算

就会有

a:00000000000000000000000000000011

b:000000000000000000000000011111111

c:00000000000000000000000010000010

c是char类型 又会发生截断

c:10000010

%d是打印十进制的整数 c发生整形提升

11111111111111111111111110000010 补码

10000000000000000000000001111110  原码

二进制转换为十进制的结果位-126

#include<stdio.h>
int main()
{
	//char = signed char
	char a = 3;
	//00000000000000000000000000000011
	//截断
	//00000011
	char b = 127;
	//00000000000000000000000001111111
	//01111111
	char c = a + b;
	//00000011
	//01111111
	//整形提升
	//00000000000000000000000000000011
	//00000000000000000000000001111111
	//00000000000000000000000010000010
	//10000010
	printf("%d", c);
	//c整形提升
	//11111111111111111111111110000010补码
	//10000000000000000000000001111110原码
	//-126
	return 0;
}




 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到