C语言中的整型提升

一.  简介

本文来简单学习一下,C语言中的整型提升。

二. C语言中的整型提升

1.  什么是整型提升?

C语言中的算数运算表达式总是以整型的精度进行的,为了获得这个精度,表达式的字符和短整型操作数在使用之前被隐式转换为普通类型即整型提升。

表达式中的 字符型(即 char)和短整型(即 short)类型操作数在使用之前被转换成普通整型 int类型,这种转换叫做整型提升。整型提升针对类型小于整型的  char, short。char占用1字节空间,short占用2字节空间,在运算时都会提升为占用4个字节的int类型,所以,C的整型算术运算总是至少以缺省整型类型的精度来进行的。换而言之整形算术运算都至少以 int类型计算的。

2. C语言中整型提升的意义?

整型提升的意义在于:表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是 int类型的字节长度,同时也是CPU的通用寄存器的长度。

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

                                                                                                                                  --<百度百科>

三.  如何进行整型提升?

1.  如何进行整型提升?

整形提升是按照变量的数据类型的符号位来提升的。

有符号整数的整型提升:

负数的整形提升:高位补充符号位,即补1(负数的符号位是 1)。

例如,char c1 = -1char类型占1字节,也就是它的二进制补码只有8个比特位 :11111111
因为 char是有符号位的 char,所以整形提升的时候,高位补符号位 1
提升之后的效果为:11111111 11111111 11111111 11111111

正数的整形提升:也是高位补充符号位,即补 0(正数的符号位为 0)。

char c2 = 1;
变量 c2 的二进制位(补码)中只有8个比特位:00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:00000000 00000000 00000000 00000001

无符号的整形提升:高位直接补 0

2. 举例说明

举例一

举例来说明,C语言是如何进行整型提升的?有如下代码:

#include <stdio.h>int main(void)
{char a = 3;char b = 127;char c = 0;c = a+b;printf("c: %d\n", c);return 0;
}

输出结果如下:

注意:这里有一点需要注意数据在内存存放的是数据的补码,而打印的是源码! 

正数的补码与原码相同;

负数的补码为 其原码取反 +1。补码求原码也补码取反+1;

分析如下:
 

char a = 3;char 是 一个字节即 8位,  a为 : 00000011

char b = 127;同理,b 为 :01111111

char c = a + b,接下来要进行整型提升
当前 char 为有符号的char,所以对于a就高位补0,为:

00000000 000000000 000000000 00000011
b 整形提升后为:00000000 00000000 00000000 01111111

a+b 相加后为: 00000000 00000000 00000000 10000010,将这个 32 位二进制放到 c 中,截断为 10000010。

printf("%d\n", c)中,%d是打印十进制的数,所以还需整形提升,此时 c10000010,符号位为:1,整形提升高位补1,最终为:

11111111 11111111 11111111 10000010(补码),

其原码为:10000000 00000000 00000000 01111110 ,所以这个数字输出为 -126

举例二

如下代码对 a, b,c 的比较:

int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)printf("a");
if(b==0xb600)printf("b");
if(c==0xb6000000)printf("c");
return 0;
}

分析如下:

当 进行 a== 0xb6 比较运算时,a进行了整型提升。a 为 10110110

整型提升后 a 为:11111111 11111111 11111111 10110110 (补码)

求其则原码为:10000000 00000000 00000000 01001010,char为 一个字节,截断后 a = -0x4A

同理, b == 0xb600 比较运算时,b 也进行了整形提升,经过一轮整形提升后 b 为 -4A00。

而 c==0xb6000000比较运算时,c 本身就是 int类型 无需提升,因此 c就是 0xb6000000。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中Apache网站基于Http服务的访问限制(基于地址/用户)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月3日11点44分 &#x1f004;️文章质量&#xff1a;95分 为了更好地控制对网站资源的访问&#xff0c;可…

谈谈JDK 漏洞 6260652

JDK 漏洞 6260652 在看ArrayList源码的过程中 发现带参构造里有一个注释&#xff1a; // c.toArray might (incorrectly) not return Object[] (see 6260652) public ArrayList(Collection<? extends E> c) {elementData c.toArray();if ((size elementData.length) …

动物收容所

题目链接 动物收容所 题目描述 注意点 若没有可以收养的动物&#xff0c;则返回[-1,-1]收纳所的最大容量为20000编号随着收养动物的增加自增 解答思路 利用队列先进先出的特点将猫和狗分别存进两个队列中&#xff0c;关键是dequeueAny这个方法中如果此时猫和狗的队列中都有…

演讲全文|林涛:MongoDB助力智能制造出海控本增效

5月29日-30日在上海世博中心举办的亚马逊云科技中国峰会圆满结束。本文整理了MongoDB北亚区方案与咨询总监林涛在白金讲堂的演讲全文&#xff0c;就《MongoDB助力智能制造出海控本增效》话题与大家共同探讨。 白金讲堂演讲视频 从全球经济竞争的角度看&#xff0c;中国制造业…

C++标准模板(STL)- 迭代器库-迭代器适配器- 逆序遍历的迭代器适配器 (二)

迭代器库-迭代器原语 迭代器库提供了五种迭代器的定义&#xff0c;同时还提供了迭代器特征、适配器及相关的工具函数。 迭代器分类 迭代器共有五 (C17 前)六 (C17 起)种&#xff1a;遗留输入迭代器 (LegacyInputIterator) 、遗留输出迭代器 (LegacyOutputIterator) 、遗留向前…

网站安全小白也能搞定的SSL证书安装免费方法

大家都知道&#xff0c;部署一个网站&#xff0c;除了购买域名&#xff0c;现在基本标配SSL证书。 我们以aliyun为例 大家看到这个&#xff0c;收费的SSL证书几千-几万1年不等。这时候&#xff0c;你就会想有没有免费的可以搞。linux老鸟都知道&#xff0c; Let’s Encrypt 、…

Megapoly.Art - Mechanic Shop Pack

Megapoly.art很高兴推出“汽车机械师包”。这个模块化包包括创建汽车机械师场景所需的一切,从简单的工具到先进的机器,包括路虎卫士的额外内容。 移动友好型低多边形建模和优化的纹理。 包信息 总计:129个预制件 - 5个独特的机器,21个建筑预制件,98个道具和奖励内容路虎(…

JVM类加载机制和双亲委派

类加载机制 java文件需要编译成字节码文件(.class文件)&#xff0c;jvm是通过类加载机制&#xff0c;将.class文件加载进内存&#xff0c;经过验证连接->初始化直到使用该对象的过程就是类加载机制&#xff0c;当new对象的时候&#xff0c;jvm首先去常量池寻找该类的符号引用…

LabVIEW电路板性能与稳定性测试系统

LabVIEW电路板性能与稳定性测试系统 概述&#xff1a; 开发基于LabVIEW的电路板性能与稳定性测试系统&#xff0c;通过集成多种测试仪器&#xff0c;实现对电路板的电气性能和长期稳定性的全面评估。系统涵盖了电压、电流、温度等多项参数的监测&#xff0c;并具备自动化测试…

Navicat+sqlite操作数据

使用navicat操作数据库&#xff08;比如sqlite数据库&#xff09;可以实现与access&#xff08;参考该文&#xff09;一样的操作&#xff0c;可以导入导出excel等格式的文件&#xff0c;如下图所示。 两种方式的sql语句的语法也基本一样。

C# PaddleOCR 单字识别效果

C# PaddleOCR 单字识别效果 效果 说明 根据《百度办公文档识别C离线SDKV1.2用户接入文档.pdf》&#xff0c;使用C封装DLL&#xff0c;C#调用。 背景 为使客户、第三方开发者等能够更快速、方便的接入使用百度办公文档识别 SDK、促进百度 OCR产品赋能更多客户&#xff0c;特设…

水泵选型指南

在现代暖通空调&#xff08;HVAC&#xff09;系统中&#xff0c;冷冻水泵是关键组件之一&#xff0c;它在提供冷却和空调效果方面起着至关重要的作用。选择合适的冷冻水泵不仅可以提高系统效率&#xff0c;还能节省能源和维护成本。本文将介绍冷冻水泵选型的关键因素和步骤。 …

【遗传算法】【机器学习】【Python】常见交叉方法(二)、多点交叉和均匀交叉

往期遗传算法文章见&#xff1a; 【遗传算法】【机器学习】【Python】常见交叉方法&#xff08;一&#xff09;、单点交叉和两点交叉 一、遗传算法流程图 交叉过程即存在于上图的”交叉“&#xff08;crossover&#xff09;步骤中。 二、多点交叉 多点交叉的原理就是&#x…

金融科技发展报告:移动支付的市场格局、趋势与优缺点

一、引言 随着科技的飞速发展,金融科技已成为推动全球经济发展的重要力量。移动支付作为金融科技的重要分支,其市场格局与趋势日益受到业界的关注。本报告将详细剖析移动支付的市场格局,并深入探讨其发展趋势,同时结合相关案例和数据,为读者呈现移动支付的优缺点,以及国…

LNMP网络架构的搭建

操作准备&#xff1a;准备三台虚拟机 安装 MySQL 服务 &#xff08;1&#xff09;准备好mysql目录上传软件压缩包并解压 cd /opt mkdir mysql tar xf mysql-boost-5.7.44.tar.gz &#xff08;2&#xff09;安装mysql环境依赖包 yum -y install ncurses ncurses-devel bison…

JVM之垃圾回收面试总结

文章目录 1.GC概述1.1 什么是垃圾1.2 为什么需要GC&#xff1f;1.3 早期垃圾回收1.4 Java垃圾回收机制1.5 评估GC的性能指标 2.垃圾回收相关算法2.1 垃圾标记阶段的算法2.1.1 引用计数算法(Java没有使用)2.1.2 可达性分析算法 2.2 垃圾清除阶段的算法2.2.1 标记-清除(Mark-Swee…

RAG 高效应用指南 :Query 理解

前言 构建一个检索增强生成 (Retrieval-Augmented Generation, RAG) 应用的 PoC&#xff08;概念验证&#xff0c;Proof of Concept&#xff09;过程相对简单&#xff0c;但要将其推广到生产环境中则会面临多方面的挑战。这主要是因为 RAG 系统涉及多个不同的组件&#xff0c;…

Termux安装SSH服务与内网穿透工具实现远程SFTP传输文件

文章目录 前言1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 前言 本教程主要介绍如何在安卓 Termux 系统中使用 SFTP 文件传输并结合[cpolar内网穿透工具](cpolar - 安全的内网穿透工具)轻松实现无公网IP远程传输&#xff0c;无需购…

ATFX汇市:加拿大央行或启动首次降息,关注加元贬值风险

ATFX汇市&#xff1a;今日21:45&#xff0c;加拿大央行将公布6月份利率决议结果&#xff0c;当前的基准利率为5%&#xff0c;市场普遍预期其将降息25基点&#xff0c;最新基准利率有可能调降至4.75%。市场人士预期降息的主要依据有两点&#xff0c;其一是加拿大央行行长麦克勒姆…

超级详细Spring AI运用Ollama大模型

大模型工具Ollama 官网:https://ollama.com/ Ollama是一个用于部署和运行各种开源大模型的工具; 它能够帮助用户快速在本地运行各种大模型&#xff0c;极大地简化了大模型在本地运行的过程。用户通过执行几条命令就能在本地运行开源大模型&#xff0c;如Lama 2等; 综上&#x…