test4:整型提升 \ char short 例0xb6 分析if判断式 \ 隐式类型转换

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	char a = 3;//写上char的一瞬间,机器默认就发生整型提升了<第一次整型提升>
	char b = 127;//写上char的一瞬间,机器默认就发生整型提升了<第一次整型提升>
	printf("%d\n", a + b);//这时还是int型的
	char c = a + b;//这时发生<第二次整型提升>
	printf("%d", c);
}

在这里插入图片描述
【整型提升】
实质原因是在计算机中,进行运算的器件ALU一般是int型的,所以要运算就要求操作数是int型

char a 当写上char 就相当于开辟了一个char型的空间,与此同时赋值的内容3,也会机器默认转换成int型的,方便之后你做什么用
这是<第一次整型提升>

随后你运算他们,结果还是int型的
直到这个int型的结果,又赋值给char型
这时发生<第二次整型提升>

整型提升发生在char和short int型,包含有符号无符号,要运算必须得够int这32个bit位,char是1字节8bit,short是2字节16bit

这些输入char,赋值给char无形中机器默认就发生整型提升的事,叫[隐式类型转换]

但是结果为什么是-126?
在这里插入图片描述
//-------------------------------------------------------
分析能输出哪个结果?

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	char a = 0xb6;//十六进制b6=二进制1011 0110
	short b = 0xb600;//十六进制b600=二进制10110110 00000000
	int c = 0xb6000000;//十六进制b6000000=二进制//10110110  00000000 00000000 00000000
	if (a == 0xb6)
		printf("a");
	if (b == 0xb600)
		printf("b");
	if (c == 0xb6000000)
		printf("c");
}
//0xb6=00000000 00000000 00000000 1011 0110
//char a实际只能接收到后8位,是1011 0110,所以if a错

//0xb600=00000000 00000000 10110110 00000000
//short a实际只能接收到后16位,是10110110 00000000,所以if b也错

//0xb6000000=10110110  00000000 00000000 00000000
//int c实际接收到是10110110  00000000 00000000 00000000,是这个32位的数,c正确

//0xb6=00000000 00000000 00000000 1011 0110
//char a实际只能接收到后8位,是1011 0110,所以if a错

//0xb600=00000000 00000000 10110110 00000000
//short a实际只能接收到后16位,是10110110 00000000,所以if b也错

//0xb6000000=10110110 00000000 00000000 00000000
//int c实际接收到是10110110 00000000 00000000 00000000,是这个32位的数,c正确
在这里插入图片描述
//---------------------------------------------------------
看这个,输出结果为什么是141

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	char c = 1;
	printf("%u\n", sizeof(c));
	printf("%u\n", sizeof(+c));
	printf("%u\n", sizeof(!c));
}

在这里插入图片描述
%u 是以十进制数,输出unsigned型数据
1、c=1 c是char型 chai是1字节 所以是1;
2、c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节.
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof© ,就是1个字节.
3、!c是取反,不属于运算

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值