c语言中存在整形提升和算术提升。当两种不同的数据类型做运算时,就会出现整型提升或算术提升。
- 整型提升:比整型数据类型小的数据做运算时,会先把自己提升为整型,再做运算。
- 算术转换:只要由一个比整型数据类型大的数据,这两个数据做运算,其中较小的数据类型会发生算术转换,先提升为较大的那个数据的类型, 再做运算。
一、整型提升
#include <stdio.h>
int main()
{
short a = 3;//short 类型,占2个字节
int b = 2; //int 类型, 占4个字节
int c = a + b; //short类型的变量和int类型的变量相加,
//short类型的变量会发生整型提升
//提升为int类型,再做加法
printf("c = %d\n", c);
return 0;
}
总结:小于int类型的变量,会先把自己提升为int类型在做加减乘除等运算。
二、算术转换
long double
double
float
unsigned long int
long int
unsigned int
int
#include <stdio.h>
int main()
{
int a = 3;//int 类型,占4个字节
double b = 2.0; //double 类型, 占8个字节
double c = a + b; //int类型的变量和double类型的变量相加,
//a发生算术转换,由int类型提升为double类型,再做运算
printf("c = %lf\n", c);
return 0;
}
总结:比int类型大的数据的提升,叫算术转换。
- 发生时机:两个数字相运算,只要有一个数据的类型比int类型大,那么较小的那个数据将发生算数转换,先提升为较大的那个数据的类型,再做运算。
三、算术提升小练习
#include <stdio.h>
int i;
int main()
{
i--;
if (i > sizeof(i))
{
printf(">");
}
else
{
printf("<");
}
return 0;
}
运算结果:>
那么为什么是>呢?
(1) i 是全局变量,如果不初始化,默认值为0
(2) sizeof 的返回值是size_t, 由上图我们可以看到:size_t是一个宏的定义,他的类型是unsigned long long, 无符号长长整型。
(3) i 的类型是int,sizeof的返回值类型是unsigned long long,大于整型数据类型,所以发生算术提升。i 的类型小于sizeof(i)的类型,所以i发生算术提升,提升为unsigned long long类型。
(4) 无符号整型的每一位都是有效位,i–得到-1,-1在内存中的存储表示为32个全1,由于每一位都是有效位,所以是一个非常大的数字。而sizeof(i)==4,所以条件表达式为真,输出:>
总结
注意:整型和算术转换是如何进行提升的。提升为什么样的类型。