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

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;
}




 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值