c语言-隐式类型转换,算数转换

一.隐式类型转换

1.隐式类型转换是通过整形提升方式来作用的,首先我们需要了解原码,反码,补码是怎么一回事.

原码,反码,补码:
1.正数的原码,反码,补码(三码相等),例如:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 —— 1的原码
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 —— 1的反码
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 —— 1的补码
2.负数的原码,反码,补码,例如:
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 —— -1的原码
//负数的原码符号位不变,其他位按位取反得到反码
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 —— -1的反码
//负数的反码加1得到补码。
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 —— -1的补码
*计算机中的数据一律以补码形式存储

*补码转化到原码的形式有两种:
第一种:补码取反得到一串二进制序列(注意此序列不是反码)然后给此二进制序列加1得到原码。
第二种:补码减1得到反码再给反码取反得到原码。

对于在内存中所占字节小于int的数据,例如 char,short类型的数据,在进行加减时会进行隐形转换,转换成int类型的数据后再进行加减,下面我们来通过实例来体会一下隐式转换:

有符号整形提升符号位是几前面就添加几
无符号整形提升直接补0

int main()
{
	char a = 3;//有符号的a
	//00000000000000000000000000000011 -- 3的补码
	//截断
	//00000011 -- 截断后的a

	char b = 127;
	//00000000000000000000000001111111 -- 127的补码
	//截断
	//01111111 -- 截断后的b

	char c = a + b;
	//00000011 -- 截断后的a
	//01111111 -- 截断后的b
	//将截断后的a和b整型提升
	//00000000000000000000000000000011 -- 整形提升后的a
	//00000000000000000000000001111111 -- 整形提升后的b
	//00000000000000000000000010000010 -- a+b的结果
	//10000010 -- 再进行截断存储到c里面
	printf("%d\n", c); //此处c又会进行整形提升
	//11111111111111111111111110000010 - 补码
	//11111111111111111111111110000001 - 反码
	//10000000000000000000000001111110 - 原码
	//-126
	return 0;
}

下面这个例子也很好的体现出了整形提升。

int main()
{
	char a = 0xb6;
	short b = 0xb600;
	int c = 0xb6000000;
	if (a == 0xb6)//这里的a进行了整形提升所以a!=0xb6(10110110)
		printf("a");
	if (b == 0xb600)//同理
		printf("b");
	if (c == 0xb6000000)//这里由于c为int型所以不用整形提升,表达式成立输出c
		printf("c");
	return 0;
}

另外:
有符号的char的取值范围是:-128~127
无符号的char的取值范围是:0~255
如下图:

在这里插入图片描述

从这里我们可以直接看出上面代码的b(127)+a(3)的值为-126(顺时针走)

二.算数转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类
型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

long double
double
float
unsigned long int
long int
unsigned int
int                //向上转化

例如这里是将a–>double,然后c的值为8.4
在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值