1.运算时的类型提升(发生在同类型计算下)
1)首先我们先看一段代码
unsigned char c=256; printf("%d",c);
运行结果:0;
这是为什么呢?我们来分析一下,unsigned char 的取值范围是【0,255】,二进制表示形式为11111111,正好占满了所有的内存,而256的二进制为10000000,我们来比较一下 11111111 10000000 这里会发生截断,也就是最终只保留了00000000,所有运行结果是0;
2)再来看一段代码
unsigned char c=-1; printf("%d",c);
运行结果:255;
分析:
-1 源码:10000001 反码:11111110 补码:11111111 //在无符号char类型下它的结果就是255
3)再来看一段代码
char a = 5;// 00000000000000000000000000000111(运行时会进行整形提升) char b = 127;// 00000000000000000000000001111111 char c = a + b;//00000000000000000000000010000110 先截断10000110(符号位是1,是负数,转化为源码=-124) printf("%d", c);
运行结果:-124
其实float进行运算时会转化为double进行运算,这个大家可以自己动手试试
2.不同类型计算
规则:
char , short ,int 都是整形家族
char和int运算转化为int 运算
int 和float运算转化为double运算
double和int运算转化为double运算
1)看一段代码猜结果
int a=2; printf("%f",a/3);
运行结果:0.000000
这个大家是不是会很简单的得出结果,因为a和3都是整形,所以小数点后的值是不会进行计算,因此最后的结果就是0;
2)再看一段代码猜结果
float b=2; printf("%f",b/3);
运行结果:0.666667
大家应该也能猜猜出来了,因为float和int进行运算时,int会被强转为float,所以小数点是会进行运算,所以最后的结果是0.666667。
可能大家会觉得,这些都是一些小知识,那有什么难度,但越是这样,我们越容易在这个上面出错,当我开始很多题之后,发现有时候卡住我的并不是那些很难掌握的知识点,而是那些我平时忽略的那些细节知识,那些错误经常让我摸不着头脑,神出鬼没,让我总以为是电脑或者自己做题目做糊涂了,因此,我们更要重视那些细节和小知识。