当前位置: 首页 > news >正文

C语言之整型提升

文章目录

  • 1 有可能出现的问题
  • 2 产生以上问题的原因(整型提升)
  • 3 整型提升的过程
  • 4 整型提升示例
  • 5 总结


1 有可能出现的问题

代码如下

#include <stdio.h>int main ()
{int a = -1;unsigned int b = 1;if (a < b) {printf("a < b");} else {printf("a >= b");}return 0;
}

运行结果
在这里插入图片描述

2 产生以上问题的原因(整型提升)

在表达式计算时,各种整型首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。

**为什么要使用整型提升:**表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。简单来说就是为了在计算中有更快的速度。

3 整型提升的过程

1. 有符号整数的整型提升:高位补充符号位char var1 = -1;负数在内存中以补码的形式存储,且char类型占一个字节,即8bit故变量 var1 的二进制补码为1111   1111整型提升之后,高位补充符号位1int32bit提升后为1111    1111    1111    1111    1111    1111    1111    1111char var1 = 1;正数的补码和原码相同,同理可得变量var1的二进制补码为 0000  0001整型提升之后,高位补充符号位0,提升后为0000    0000    0000    0000    0000    0000    0000    00012. 无符号整数的整型提升:高位补0即可

4 整型提升示例

基础知识: 补码的编码规则是:符号位0表示正,1表示负,正数的补码等于原码,负数的补码等于反码末位加1。

#include <stdio.h>/*
思路:a补码:1111  1111b补码:1100  0111整型提升后(按照32bit):a补码:1111  1111    1111  1111    1111  1111    1111  1111   b补码:1111  1111    1111  1111    1111  1111    1100  0111相加之后  ==  (a + b)补码1111  1111    1111  1111    1111  1111    1100  0110转化为原码后1000  0000    0000  0000    0000  0000    0011  101058最终打印的值为 -58*/
int main() {char a = -1;char b = 199;char c = a + b;printf("%d", c);return 0;}

5 总结

在C语言中,当表达式中包含不及int大小的变量时,编译器会自动将其提升为整型,因此需要特别注意这种情况。

相关文章:

  • [Angular] 笔记 9:list/detail 页面以及@Output
  • mysql使用全文索引+ngram全文解析器进行全文检索
  • 基于SpringBoot的中小型企业质量管理
  • 医院安全(不良)事件报告系统源码 支持二次开发、支持源码交付
  • Postman接口测试工具使用
  • STL——查找算法
  • kubeadm来搭建k8s集群。
  • C++构建简单静态库实例(cmakelist)
  • 【Yii2】数据库查询方法总结
  • 学习体系结构 - AArch64内存管理
  • HTML-基础知识-基本结构,注释,文档说明,字符编码(一)
  • 【Pytorch】学习记录分享8——PyTorch自然语言处理基础-词向量模型Word2Vec
  • 记录一下imx6ull linux 5.10.9多点电容触摸屏驱动报错问题解决方法
  • Python中matplotlib库的使用1
  • 《Spring Cloud学习笔记:微服务保护Sentinel + JMeter快速入门》
  • canvas 高仿 Apple Watch 表盘
  • CSS魔法堂:Absolute Positioning就这个样
  • docker-consul
  • GitUp, 你不可错过的秀外慧中的git工具
  • javascript 哈希表
  • JavaScript设计模式系列一:工厂模式
  • Java基本数据类型之Number
  • spring boot 整合mybatis 无法输出sql的问题
  • 服务器之间,相同帐号,实现免密钥登录
  • 给第三方使用接口的 URL 签名实现
  • 汉诺塔算法
  • 基于axios的vue插件,让http请求更简单
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 深度解析利用ES6进行Promise封装总结
  • 实习面试笔记
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信开放平台全网发布【失败】的几点排查方法
  • 学习Vue.js的五个小例子
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 智能合约开发环境搭建及Hello World合约
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • $().each和$.each的区别
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • ( 10 )MySQL中的外键
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2015)JS ES6 必知的十个 特性
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (ZT)一个美国文科博士的YardLife
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)人的集合论——移山之道
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net Core与存储过程(一)
  • .Net IOC框架入门之一 Unity
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET/C# 项目如何优雅地设置条件编译符号?