C89标准:
整值提升:将出现的字符类型(char)和短整型(short)统一提升为int类型(特殊情况下,也会提升为unsigned int) 1.如果左右操作数中存在浮点值 ?? ?(1) 如果一个操作数是long double,另一个操作数自动转换为long double ?? ?(2) 如果一个操作数是double,另一个操作数自动转换为double ?? ?(3) 如果一个操作数是float,另一个操作数自动转换为float ? ? ?? ?浮点值的优先级 ?long double > double > float ?? ?这一块操作数,浮点值和整形值混用 2.如果左右操作数中不存在浮点值? ?? ?(1) 首先整治提升(不要存在字符类型和短整型) ?? ?(2)? int < unsigned int < long < unsigned long ?? ?(3) 特殊:如果两个操作数大小相等,并且一个是unsigned int,另一个是long int,则两个全部转换为unsigned long int?
赋值语句: 左值大小 >= 右值大小 ?则自动转换 这里需要注意的点: ? ? ?① 如果左边操作数类型 存储不下 ?右边操作数的值,则很危险 ?? ? ② 浮点值默认double,如果定义float a = 3.14; 会触发double转换为float,数据阶段 ?? ? ③ 将浮点值赋值给整型值,会发生数据丢失(丢失小数点之后的数据)
C99标准:
相较于C89,多了一些数据类型(bool,?long long int, 复数类型)
C99将所有整型类型分等级:从高到低 ? ? ? ? ? ?①? long long int ? ? unsigned long long int ?? ??? ? ? ②? long int ? ?unsigned long int ?? ??? ? ? ③ ?int ? unsigned int ?? ??? ? ? ④ ?short int ? ? unsigned short int ?? ??? ? ? ⑤ ?char ?unsigned char ? signed char ? ? ? ? ? ?⑥? bool?
注意:在使用的时候,具体分两种情况: ① 操作数中带浮点值,和C89一致 ②操作数中如果不带浮点值:(4个条件,从上到下触发,触发其中一个则退出) ? ? ? 第一、 如果两个操作数都是有符号类型或者都是无符号类型,小的向大的转化 ? ? ? 第二、 如果无符号操作数类型 >= 有符号操作数类型,则有符号向无符号操作数转换 ? ? ? 第三、? 2.3: 如果有符号操作数类型 > 无符号操作数类型,如果无符号操作数能表示的范围可以用有符号去表示,则无符号想有符号操作数转化 ? ? ? 第四、 两个同时向有符号类型的无符号类型转化 ? ?特殊:如果两个操作数大小相等,并且一个是unsigned int,另一个是long int,则两个全部转换? ? ? ? ? ? ? ?为unsigned long int (见以下代码) ③所有的类型都可以转化bool类型,如果值为0转化为false ? 要不然则为true ?
#include<stdio.h>
#include<typeinfo>
int main()
{
char c;
short s;
unsigned short us;//unsigned short int us;
int i;
unsigned int ui;
long l;
unsigned long ul;
float f;
double d;
long double ld;
printf("%d\n", sizeof(c+s));//打印字节
//打印类型,注意加提示头文件typeinfo
printf("%s\n", typeid(c+s).name());//int
printf("%s\n", typeid(c+us).name());//int
printf("%s\n", typeid(s+us).name());//int
printf("%s\n", typeid(us+i).name());//int
printf("%s\n", typeid(i+ui).name());//ui
printf("%s\n", typeid(i+l).name());//l
printf("%s\n", typeid(ui+l).name());//unsigned long int
/*注意,如果两个操作数大小相等,并且一个是unsigned int,一个是long,则两个全部转化为unsigned long
printf("%s\n", typeid(l+ul).name());//ul
printf("%s\n", typeid(f+s).name());//f
printf("%s\n", typeid(f+c).name());//f
printf("%s\n", typeid(f+i).name());//f
printf("%s\n", typeid(d+ui).name());//d
printf("%s\n", typeid(d+l).name());//d
printf("%s\n", typeid(ld+s).name());//ld
printf("%s\n", typeid(ld+i).name());//ld
return 0;
}
|