每天学一点系列~看得见摸不着的“隐式类型转换”

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=1printf("%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]
【每天学一点系列~】一文带你彻底弄懂结构体大小和内存对齐

创作不易,给个三连呗亲!
在这里插入图片描述

以上是关于每天学一点系列~看得见摸不着的“隐式类型转换”的主要内容,如果未能解决你的问题,请参考以下文章

转化课-计算机基础

每天学一点系列~诡异的死循环

每天学一点系列~字符串左/右旋的本质,你真的认清了嘛?

每天学一点系列~这些内存函数你知道么?还记得么[doge]

每天学一点系列~一文带你彻底弄懂结构体大小和内存对齐

Python每天学一点之argparse