栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【学习笔记】C语言中,表达式求值时不可忽略的细节—— 隐式类型转换

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【学习笔记】C语言中,表达式求值时不可忽略的细节—— 隐式类型转换

Pre:

        表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。


隐式类型转换

        C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

        表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

        通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

以例说法:  ​​​

Q:为什么printf的结果为-126?

A:因为char类型所占内存大小为1个字节(即8个比特位),而int类型所占用的内存大小为4个字节(32个比特位),因此char a = 3 这样一个操作,就会造成截断。

        截断之后将进行整形提升:

                整形提升是按照变量的数据类型的符号位来提升的。例如:char c1 = -1;变量c1的二进制位(补码)中只有8个比特位:1111111,因为 char 为有符号的 char所以整形提升的时候,高位补充符号位,即为1。提升之后的结果是:11111111111111111111111111111111。

        

         整形提升之后,a和b就可以相加了,相加结果为:

         我们再往后看这行代码:

         c又是个字符串类型,因此还会发生截断。

          截断之后再进行整形提升:

 (之所以要写出原码,是因为printf是按原码打印出的。)

        好的,现在我们现在来看看10000000000000000000000001111110这串原码,将其读出来就是-126。到此便解释了为什么printf的结果为-126。( ̄︶ ̄)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846829.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号