本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Part I、整型提升
C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符(char)和短整型(short)操作数在使用之前被转换为普通整型(int),这种转换称为整型提升。 整型提升的方式—— 如:
char a,b,c;
a = b + c;
1、将b和c提升为int型(在其存储数据的八位二进制中高位补符号位,直至32位) 2、进行相应的运算后,将结果截断,存放到a中
1、 sizeof与整型提升
如:
char c=1;
printf("%d\n",sizeof(c));---------- 1 :正常char类型的大小
printf("%d\n",sizeof(+c));--------- 4 :对char类型进行了运算,故将其整型提升为int
printf("%d\n",sizeof(!c));--------- 4 :理由同上
2、整型提升的原因
CPU的整形运算器操作的字节数一般为4,即int的字节长度,所以小于int的整型都要先转为int再送去CPU执行运算。
3、 算数转换方式
如果一个操作符的操作数类型不同,则将其统一转换为一个类型,转换规则如下:
long double double float unsigned long int
long int unsigned int int 从下往上转换!
Part II、函数的返回值
函数的返回类型取决于函数的定义而非返回的那个值; 比如:
int fun()
{
return 3.14;
}
尽管返回的是浮点数,但由于函数定义时返回值类型为int,所以3.14会被强制类型转换后返回;
Part III、函数的参数
函数的参数会根据接收的整型变量的类型而进行强制类型转换 如:
char arr[]="abc";
strlen(&arr);
尽管&arr是数组类型,但由于strlen的参数为==const char*==,所以上面的程序运行起来还是会计算出arr的长度;
Part IV、printf中的类型转换
由于printf是可变参数的函数,所以后面参数的类型是未知的,所以甭管你传入的是什么类型,printf只会根据类型的不同将用两种不同的长度存储。 其中8字节的只有long long、float和double(注意float会处理成double再传入),其他类型都是4字节。 另外,读取时,%lld、%llx等整型方式和%f、%lf等浮点型方式读8字节,其他读4字节。
Part V、接收变量的类型转换
int a = 3.14;
printf("%d\n",a);
与
printf("%d\n",(int)3.14);
二者的输出结果都为3,因为赋值会根据接收变量的类型进行强制类型转换!
Part VI、系列文章索引
【每天学一点系列~】诡异的死循环 【每天学一点系列~】字符串左/右旋的本质,你真的认清了嘛? 【每天学一点系列~】这些内存函数你知道么?还记得么[\doge] 【每天学一点系列~】一文带你彻底弄懂结构体大小和内存对齐
创作不易,给个三连呗亲!