【每周分享】C语言的整型提升是什么概念

张开发
2026/4/13 14:16:07 15 分钟阅读

分享文章

【每周分享】C语言的整型提升是什么概念
在介绍C语言的整型提升概念之前我们先来看一段实际的代码例子和仿真结果。主要代码如下复制intmain(){unsignedchari0;unsignedchartemp0;unsignedchardat0x89;unsignedcharSER0;printf(method 1\r\n);//方式1dat0x89;for(i0; i8; i){temp dati;SER temp7;printf(%d\r\n, SER);}printf(method 2\r\n);//方式2dat0x89;for(i0; i8; i){SER dat 7;dat1;printf(%d\r\n, SER);}printf(method 3\r\n);//方式3dat0x89;for(i0; i8; i){SER (dati)7;printf(%d\r\n, SER);}return0;}上面的代码主要是为了实现获取8位无符号数据dat的每一位并写入SER和打印出来理论上分析似乎都可以实现吧我们来实际运行看下结果但从上面的实际运行结果来看只有方式1和方式2的结果是符合预期的方式3的结果为什么是这样的呢这是为什么呢估计很多同仁就比较喜欢以这样一步到位的方法实现功能代码。其实在这里就涉及到了C语言的整型提升的概念。如果把代码段复制SER (dati)7;改成复制SER (unsigned char)(dati)7;//显式类型转换再运行看下这个时候方式3的代码执行结果也符合预期了。如果再把代码段复制SER (dati)7;改成复制SER (unsigned int)(dati)7;//显式类型转换再运行看下这个时候就和第一次运行的结果一样了也是不符合预期的。然后在KeilMCU中运行的结果也是如此通过以上的代码和实测对比估计很多同仁应该知道了何为整型提升了。接下来我们就从理论上说一下C语言的整型提升吧也算是再复习一次。C语言整型提升Integer Promotion的原意是一种隐式类型转换规则它规定了在表达式中当不同类型的数据进行运算时较小的整型数据类型会自动转换为较大的整型数据类型。为什么需要整型提升呢主要基于下面三个方面的考虑效率考虑CPU通常对int大小的数据操作效率最高避免溢出提升到更大的类型可以减少中间结果溢出的风险一致性确保表达式求值结果的一致性不受平台差异影响。那整型提升一般会发生在哪些情况呢主要包括如下当一个表达式中包含比int小的整数类型如char、short等时在使用位运算符(~、、|、^)时在使用算术运算符(、-、*、/)时。提升规则主要如下如果原始类型的所有值都可以用int表示则转换为int否则转换为unsignedint。在代码语句SER (dati)7; 中涉及了先左移后右移运算系统按照规则判断dat的最高位是有用的所以在执行dati时将dat的最高位保留了。比如dat1的值其实变成了unsigned int类型的0000 0001 0001 0010整个过程通过下图一目了然如果在语句前面加了显示类型强制转换unsigned char则dat1变成了0001 0010再右移7位后即为0与预期结果符合。综上所述虽然有时候将几条运算语句合并成一条语句执行运算的操作能够精简代码量但是因为C语言在数据类型转换这块其实是比较复杂的对于类似这种多个运算符参与的逻辑运算分开多条语句实现比全部用一条语句实现更好不仅代码可读性更强也不容易出错。如果你确实需要一步到位那一定要将变量的数据类型定义正确或者掌握并灵活运用C语言的显式类型转换和隐式类型转换否则在项目开发上你一定会吃大亏的~~。因此理解整型提升对于避免C语言中的一些微妙错误非常重要特别是在涉及位操作和混合类型运算时。---------------------作者dffzh链接https://bbs.21ic.com/forum.php?modviewthreadtid3477066_dsign775d7d07来源21ic.com此文章已获得原创/原创奖标签著作权归21ic所有任何人未经允许禁止转载。

更多文章