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) …

spring boot集成pg

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

LAPGAN-拉普拉斯金字塔生成网络

文章目录 基本思路:Introdution拉普拉斯金字塔LAPGANLAPGAN的正向过程训练过程基本思路:Introdution 这篇论文的一个基本方法逻辑是:利用拉普拉斯金字塔结构,将拉普拉斯金字塔中的每一层利用CGAN结构来逐步生成一个高精度的图像。 In contrast, we propose an approach t…

【linux】服务器mobaxterm安装matlab2021b(有管理员权限)

【linux】服务器mobaxterm安装matlab2021b(有管理员权限) 文章目录 【linux】服务器mobaxterm安装matlab2021b(有管理员权限)1、下载matlab2021b,下载后里面是Matlab911R2021b_Lin64.iso、Crack.zip两个文件夹2、解压Crack.zip,得到libmwlmgrimpl.so、license.lic两个文件3、…

Android Audio实战——音频配置资源定制(二)

上一篇我们通过修改 FW 层代码对系统的默认音量进行了适配,那么如果不同车型的其他 Audio 属性也有变化,那修改的内容就比较多了,而且有些属性也不适合在代码中进行赋值修改。有没有一种修改方式,直接加载不同的配置资源来实现这个功能。 一、配置信息 1、配置资源 我们知…

动物收容所

题目链接 动物收容所 题目描述 注意点 若没有可以收养的动物&#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 、…

请分别介绍下UART、I2C、SPI等协议的共同点,不同之处以及适用场景

UART、I2C、SPI是三种常用的嵌入式系统和电子设备间的通信协议&#xff0c;它们各自有不同的特性和应用场景。 共同点&#xff1a; 串行通信&#xff1a;这三种协议都是用于在设备间进行串行数据传输&#xff0c;即数据按位顺序传输。广泛应用&#xff1a;它们都在嵌入式系统…

“APT攻击防范:高级持续性威胁下的企业防御指南“

面对高级持续性威胁&#xff08;APT&#xff09;的严峻挑战&#xff0c;企业必须采取一套综合性的防御策略来保护自身免受此类复杂且持久的网络攻击。以下是一份针对APT攻击的防御指南&#xff0c;旨在帮助企业构建有效的安全防护体系&#xff1a; 1.提升安全意识与培训 • 员…

Megapoly.Art - Mechanic Shop Pack

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

PySpark教程 (一)概述pyspark

简介 PySpark 是 Apache Spark 的 Python API。它允许您在分布式环境中使用 Python 执行实时、大规模数据处理。PySpark 提供了一个交互式的 PySpark shell,您可以在其中分析数据。 PySpark 将 Python 的易用性与 Apache Spark 的强大功能结合起来,使熟悉 Python 的用户能够…

JVM类加载机制和双亲委派

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

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

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

前端 、Python 扁平化嵌套数组和应用场景

在JavaScript中&#xff0c;如果你想要扁平化嵌套数组&#xff0c;你可以使用Array.prototype.flat()方法。这个方法会按照指定的深度递归遍历数组&#xff0c;并将所有元素连接到一个新数组中。以下是一个示例&#xff1a; let nestedArray [1, [2, [3, [4]], 5]];let flatt…

揭秘银行商业汇票贴现贷款的神秘面纱

银行商业汇票贴现贷款是指银行以购买未到期商业汇票的方式向企业发放的贷款。这种贷款方式实质上是银行通过贴现&#xff0c;扣除了利息后向持票人融通资金的一种形式。 具体来说&#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;特设…