每天学一点系列~看得见摸不着的“隐式类型转换”
Posted 白龙码~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天学一点系列~看得见摸不着的“隐式类型转换”相关的知识,希望对你有一定的参考价值。
隐式类型转换
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、printf中的类型转换
由于printf是可变参数的函数,所以后面参数的类型是未知的,所以甭管你传入的是什么类型,printf只会根据类型的不同将用两种不同的长度存储。
其中8字节的只有long long、float和double(注意float会处理成double再传入),其他类型都是4字节。
另外,读取时,%lld、%llx等整型方式和%f、%lf等浮点型方式读8字节,其他读4字节。
Part IV、接收变量的类型转换
int a = 3.14;
printf("%d\\n",a);
与
printf("%d\\n",(int)3.14);
二者的输出结果都为3,因为赋值会根据接收变量的类型进行强制类型转换!
Part V、系列文章索引
【每天学一点系列~】诡异的死循环
【每天学一点系列~】字符串左/右旋的本质,你真的认清了嘛?
【每天学一点系列~】这些内存函数你知道么?还记得么[\\doge]
【每天学一点系列~】一文带你彻底弄懂结构体大小和内存对齐
创作不易,给个三连呗亲!
以上是关于每天学一点系列~看得见摸不着的“隐式类型转换”的主要内容,如果未能解决你的问题,请参考以下文章