C语言中的整形提升

整型提升

      • 一、隐式类型转换
        • 1.1 整形提升的意义
        • 1.2 如何整形提升
        • 1.3 练习
          • 1.3.1 练习1
          • 1.3.2 练习2
      • 总结

一、隐式类型转换

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

1.1 整形提升的意义

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

因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

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

char a,b,c;
a = b + c;

b和c的值被提升为普通整型,然后再执行加法运算。
加法运算完成之后,结果将被截断,然后再存储于a中。

1.2 如何整形提升

整形提升是按照变量的数据类型的符号位来提升的。
整形提升主要针对字符和短整型。(int)

int main()
{
//整形提升是按照变量的符号位来提升的
char c1 = 5;
//00000000000000000000000000000101
//00000101 -- c1(截断)char c2 = 127;
//00000000000000000000000001111111
//01111111 -- c2char c3 = c1 + c2;
//00000101 -- c1
//01111111 -- c2
//00000000000000000000000000000101
//00000000000000000000000001111111
//00000000000000000000000010000100 
//发生截断:
//10000100  -- c3
//%d: 10进制的形式打印有符号的整数
//11111111111111111111111110000100 -- 补码
//11111111111111111111111110000011 -- 反码
//10000000000000000000000001111100 -- 原码  --> -124
printf("%d\n", c3);
}
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char 且 c1是负数
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
1.3 练习
1.3.1 练习1
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;//a同b
if (a == 0xb6)     //a需要整形提升,前面补符号位,也就是1;0xb6这个值是补0的因此不相等
printf("a");//10110110 ->a 
//11111111111111111111111110110110 
if (b == 0xb600)   //b需要整形提升,前面补符号位,也就是1;0xb600这个值是补0的因此不相等
printf("b");//1011011000000000 ->b//11111111111111111111111110110110 if (c == 0xb6000000)  //c不用提升,则与这个十六进制值数相等
printf("c");
return 0;
}
1.3.2 练习2
//%u: 十进制形式打印无符号整数int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}

解答:c只要参与表达式运算(int),就会发生整形提升,所以表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节。
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof(c ) ,就是1个字节。

总结

1.整形提升发生在char 和 short类型中;
2.整形提升是按照变量的数据类型的符号位来提升的。

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

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

相关文章

数据结构第十二弹---堆的应用

堆的应用 1、堆排序2、TopK问题3、堆的相关习题总结 1、堆排序 要学习堆排序,首先要学习堆的向下调整算法,因为要用堆排序,你首先得建堆,而建堆需要执行多次堆的向下调整算法。 但是,使用向下调整算法需要满足一个前提…

面试算法110:所有路径

题目 一个有向无环图由n个节点(标号从0到n-1,n≥2)组成,请找出从节点0到节点n-1的所有路径。图用一个数组graph表示,数组的graph[i]包含所有从节点i能直接到达的节点。例如,输入数组graph为[[1&#xff0c…

微信小程序Canvas画布绘制图片、文字、矩形、(椭)圆、直线

获取CanvasRenderingContext2D 对象 .js onReady() {const query = wx.createSelectorQuery()query.select(#myCanvas).fields({ node: true, size: true }).exec((res) => {const canvas = res[0].nodeconst ctx = canvas.getContext(2d)canvas.width = res[0].width * d…

tar命令的常见用法

tar 是一种广泛使用的命令行工具,用于在 Unix 和 Unix-like 系统中创建、维护、提取以及管理 tar 归档文件。以下是 tar 命令的常见用法和选项列表: 基本命令选项 创建归档: -c: 创建一个新的归档文件。例子: tar -cf archive.tar files/ 查看归档内容…

2024--Django平台开发-Web框架和Django基础(二)---Mysql多版本共存(Mac系统)

MySQL多版本共存(Mac系统) 想要在Mac系统上同时安装【MySQL5.7 】【MySQL8.0】版本,需要进行如下的操作和配置。 想要同时安装两个版本可以采取如下方案: 方案1:【讲解】 MySQL57,用安装包进行安装。 MyS…

遗传算法解决函数最大化问题的完整Python实现

遗传算法(Genetic Algorithm,简称GA)是一种模拟生物进化过程的启发式优化算法。它通过模拟自然选择、交叉和变异等基因操作,来搜索问题的最优解。 遗传算法的基本思想是通过模拟生物的遗传机制来搜索解空间。算法维护一个种群&am…

每日一篇英语文章分享:I have a dream. 争取早日阅读论文自由.

我有一个梦想》(英文:I have a dream)是美国黑人民权运动领袖马丁路德金于1963年8月28日在华盛顿林肯纪念堂发表的纪念性演讲。 《我有一个梦想》是马丁路德金在美国黑人受种族歧视和迫害由来已久的背景下,为了推动美国国内黑人争…

Redis面试题9

Redis 持久化的方式有哪些?它们有什么区别? Redis 提供了两种持久化方式:RDB 和 AOF; RDB(Redis Database)是一种快照式持久化方式,它可以在指定的时间间隔内自动将数据集保存到硬盘上的文件中&…

【语义解析:连接自然语言与机器智能的桥梁】

语义解析:连接自然语言与机器智能的桥梁 语义解析技术可以提高人机交互的效率和准确性,在自然语言处理、数据分析、智能客服、智能家居等领域都有广泛的应用前景。特别是在大数据时代,语义解析能够帮助企业更快速地从大量的数据中获取有用的…

龍运当头--html做一个中国火龙祝大家龙年大吉

🐉效果展示 🐉HTML展示 <body> <!-- partial:index.partial.html --> <svg><defs><g id=

HTML中怎样嵌入视频

要在HTML中嵌入视频&#xff0c;请按照以下步骤进行操作&#xff1a; 获取视频文件&#xff1a;首先&#xff0c;确保你有一个视频文件。你可以使用自己的视频文件&#xff0c;或从互联网上下载到本地。 使用<video>标签&#xff1a;在HTML中&#xff0c;使用<video&…

<Python>PyQt5中UI界面和逻辑函数分开写的一种方式

前言 如果经常使用PyQt5这种模块来编写带UI界面的程序&#xff0c;那么很自然的就会涉及到&#xff0c;一旦程序比较大&#xff0c;UI控件多的时候&#xff0c;需要将UI和逻辑程序分离&#xff0c;这样方便管理&#xff0c;也方便维护。 配置&#xff1a; 平台&#xff1a;win…

Node.js 多线程实战:如何有效利用多线程能力

在 Node.js 的世界中&#xff0c;多线程技术一直是一个受到广泛关注的领域。最初&#xff0c;Node.js 设计为单线程模式。随着技术发展&#xff0c;Node.js 引入了多线程支持&#xff0c;进而利用多核处理器的强大性能&#xff0c;提升了应用性能。接下来的内容将深入探讨 Node…

【c++笔记】总结!c++与c语言的不同之处

(Θ&#xff13;Θ) hi~ 众所周知\(^o^)/~&#xff0c;c语言和c联系密切&#xff0c;又相互区别&#xff0c;本篇文章主要介绍c与c语言的区别与联系以及一些简单的不同点的运用&#xff0c;很适合刚接触c的朋友&#xff0c;一起来瞧瞧看吧~~ 目录 一、文章内容梗概 二、概念…

世微 AP6317 DC单节同步3A锂电充电芯片

AP6317是一款面向5V交流适配器的3A锂 离子电池充电器。它是采用800KHz固定频率的同 步降压型转换器&#xff0c;因此具有高达92%以上的充电效 率&#xff0c;自身发热量极小。 包括完整的充电终止电路、自动再充 电和一个度达1%的4.2V预设充电电压&#xff0c;内 部集成了防反灌…

【算法Hot100系列】搜索旋转排序数组

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

web缓存之nginx缓存

一、nginx缓存知识 网络缓存位于客户端和 "源服务器 "之间&#xff0c;保存着所有可见内容的副本。当客户端请求缓存中存储的内容时&#xff0c;它可以直接从缓存中检索内容&#xff0c;而无需与服务器通信。这样&#xff0c;网络缓存就 "接近 "了客户端&a…

Opentsdb官方优化文档 - 翻译

文档地址 : Tuning — OpenTSDB 2.4 documentation Tuning As with any database there are many tuning parameters for OpenTSDB that can be used to improve write and read performance. Some of these options are specific to certain backends, others are global. …

在线双目测宽仪 板材实时监测和数据分析!

在各种板材类生产领域里&#xff0c;在线品质检测技术都是非常重要的&#xff0c;它很大程度上决定了生产的质量。在线双目测宽仪就是当前很受欢迎的一种宽度在线检测设备&#xff0c;它采用了双目视觉检测技术&#xff0c;实现宽度尺寸的在线检测&#xff0c;功能十分强大&…

java物品检验管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web 物品检验管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…