基础数据类型的隐式转换、截断和整形改进(超详细)
文章目录。
- 前言。
- 1. 隐式转换。
- 1.1 隐式转换的规则。
- 2. 截断。
- 2.1 截断整形家庭。
- 2.2 浮点数家族的截断。
- 2.3 混合截断。
- 3. 整型提升。
- 3.1 整形提升的规则。
- 3.2 验证整形升级。
- 3.3 整形升级的例子。
前言。
你在学习C语言时有没有认真思考过?c;如果表达式两侧有不同数据类型的变量参与操作或双目操作符的操作数的数据类型不同(如int类型的数据和char类型的数据),它们会摩擦什么样的火花?c;我们来讨论一下这篇文章。
让我们化身为侦探柯南,通过现象产生的线索,找到这背后令人震惊的秘密!
1. 隐式转换。
隐式转换,指当两个或多个不同数据类型的变量参与运算时,编译器会根据规则自动将这些变量的数据类型转换为其他数据类型。。我们的程序员没有注意到这个过程c;因此,它被命名为"隐式转换"。
这个规则是什么??然后我们向下看!!!
1.1 隐式转换规则。
在谈到这个规则之前,,不知道读者脑子里有没有这样的想法:由于不同数据类型的变量参与表达式操作,会有隐藏的转换,我最好直接做出决定,直接将这些数据类型转换为最大的数据类型,这样就不会有那么多的约束了。
这个方案显然有一些缺陷。从性能和空间的角度来看,这是浪费时间资源和空间资源的一种做法。
C编译器是怎么做到的??
隐式转换规则。:
- 将低字节数据类型转换为高字节数据类型。
具体规则:以参与表达式运算的最大数据类型为标准,其他变量的数据类型都是隐式转换到这个标准的。
- 例:有一个表达式,a(char类型) + b(int类型),最后,变量a将被转换为int类型;再来一个a(char类型) + b(int类型)+ c(float类型),最后,变量a和b将转换为float类型。
将符号数转换为无符号数。
将符号数转换为无符号数。以上只是一些例子。
将整型类型转换为浮点数类型。当整数类型的数据和浮点类型的数据同时出现在表达式中时c;最终,整形数据将被隐式转换为浮点类型的数据。
。这个规则实际上是规则1的情况之一,因为这个规则比较常见,就拿出来单独讲。
2. 截断。
当高字节大小的数据赋值到低字节大小的数据时,截断现象就会发生。
2.1 截断整形家庭。
整个家庭包括:char、short、int、long 、long long…。整形截断规则。
:高位数据直接丢弃,将剩余的低数据直接赋值到变量中。
具体操作流程如下://在32位平台上。int。main。(。)。{ 。char。 a。=-。128。;//#xff08;截断)//-128原始代码:10000000 00000000 00000000 10000000。//-128反码:11111111 11111111 11111111 01111111。//-128补码:10000000 00000000 00000000 10000000。///发生截断:10000000(变量a存储值)///因为这里需要以无符号整形的方式阅读这些数据,所以要进行整形提升。printf。(。"%u\n",a。)。;//11111111 11111111 11111111 10000000(#xfff09整形升级;return。0;
}。
好了,在这里,不同数据类型的表达式操作有这么多细节,但只要我们记住这些现象的条件和相应的规则,那不是问题。
最后总结一下: | 现象。 | 条件。 |
---|---|---|
规则。 | 隐式转换。 | 当两种不同的数据类型进行表达式操作时。 |
1.将低字节的数据类型转换为高字节的数据类型;2.将符号数转换为无符号数;3.整形向浮点型转换。 | 截断。 | 当高字节数据类型赋值低字节数据类型时。 |
1.整形之间,直接放弃高位数据,剩余的数据赋值给变量;2.整形和浮点形状,小数点后面的值直接放弃,并将整数部分直接赋值给整形变量 。 | 整型提升。 | 基于标准C的特性,参与表达式操作的数据类型,所有低于int类型大小的数据类型首先转换为int类型参与操作(只有对整个家庭有效) |
1. 有符号的整数,填充和提升符号位数据后多余空间的值;2.无符号整数,在填充提升后,使用0作为额外空间的值。
如果你将来遇到两个看似正常的值,参与计算,但结果不符合你的期望,试着往这个方向思考。