✨前言✨
🎓作者:【 教主 】
📜文章推荐:
☕博主水平有限,如有错误,恳请斧正。
📌机会总是留给有准备的人,越努力,越幸运!
💦导航助手💦
目录
整形提升
在表达式计算时,要将各种整形先提升为int 类型,在进行表达式的计算,提升时前面补符号位,什么意思呢?举个例子,代码如下:
#include<stdio.h>
int main()
{
char a = 3;
char b = 127;
char c = a + b;
printf("%d", c);
return 0;
}
创建char 类型的变量a,把3赋值给a,有人问,char 不是字符型变量吗?怎么可以赋值整数?这里说明一下,字符在内存中存储时是以ASCLL值的形式进行存储的,ASCLL值是一个整数,所以本质上存进去的是整数,所以char 是整形家族的一员。
3的补码:0000000 0000000 00000000 0000001100000011
char 类型大小为1个字节,可是3占有4个字节,这里就会发生截断,即只留下低位的一个字节,所以在内存中的a:00000011
同理可得b:01111111
a+b是一个表达式,a和b的大小都小于4个字节,所以要进行整形提升,提升时前面补符号位,那就要知道a和b的正负,因为a和b都是char 类型,C语言没有明确规定char a=3 这样的表达式中char 类型是signed(有符号)还是unsigned(无符号)类型的,但是绝大多数编译器都认为是signed类型,所以进行提升时要看符号位,a和b的最高位都是0,所以前面补0,补足4字节,所以a进行提升之后:0000000 0000000 00000000 00000011
b进行提升之后:0000000 0000000 00000000 011111111
相加之后的结果:0000000 0000000 00000000 10000010
这时要把这个结果放到c里面去,可是c的空间不够啊,所以要进行截断,最终c在内存中就是这样:10000010
下面要以%d的形式对c进行打印,%d打印是以10进制的int 类型打印,可是c不足int 类型,你猜到了,没错,进行整形提升,c是signed类型,前面补符号位,所以提升之后就是这样:11111111 11111111 11111111 10000010,//注意内存中存储的都是补码,要先转换为原码才能得到得到这个数。原码:10000000 00000000 00000000 01111110
这个数应该是-126,结果是不是这样呢?来看
我将涉及到的二进制码及需要进行整形提升的地方放在代码的注释中了,如下:
#include<stdio.h>
int main()
{
char a = 3;
//3的二进制码:00000000 00000000 00000000 00000011
//截断
//a:00000011
char b = 127;
//127的二进制码:00000000 00000000 00000000 01111111
//截断
//b:01111111
char c = a + b;
//a提升后:00000000 00000000 00000000 00000011
//b提升后:00000000 00000000 00000000 01111111
//a+b:0000000 0000000 00000000 10000010
//截断
//c:10000010
//c提升之后(补码):11111111 11111111 11111111 10000010
//原码:10000000 00000000 00000000 01111110
//-126
printf("%d", c);
return 0;
}
///对原码,补码不了解的可以去看这篇博客:C语言:数据存储(整数+浮点数+大小端模式)
算数转换
如果一个操作符的各个操作数属于不同的类型,那么其中某些操作数必须转换为其他操作数类型,否则无法进行计算。
转换规则:
- 小于int类型的先进行整形提升
- 排名低的向排名高的转换(如下图)
举个例子:代码如下:
#include<stdio.h>
int main()
{
int a = 1;
float b = 4;
float c = a / b;
printf("%lf", c);
return 0;
}
a必须先转换为float 类型之后才能进行计算,不然无法计算。
运行结果如下:
可能这个结果没有什么说服力,再举个例子:
#include<stdio.h>
int main()
{
int a = 1;
int b = 4;
float c = a / b;
printf("%lf", c);
return 0;
}
a/b,因为a和b都是int 类型,不需要进行提升,所以a/b的结果被认为还是int 类型,是int 类型就只会截取整数部分,所以c里面存的就是0。
运行结果如下:
欢迎关注,码字不易,希望多多点赞、收藏哦!抱拳了。