还不进来看吗?c趁你不注意偷偷将你的数据类型转换啦

news2025/4/7 7:20:15

前言

如果不了解 整形提升 的小伙伴可就要注意了,c偷偷将你的数据类型改变了你都不知道.快点和牛牛一起学习一下c语言中 整形提升的知识吧 !

一、整形提升是什么,又是怎样提升的?

不知道小伙伴们有没有听过整形提升这个词?
整形提升是什么呢?
C语言中,在进行算术运算的时候总是至少
默认以整型类型的精度来进行的。为了获得这个精度,表达式中的字符形和短整型操作数在使用之前被转换为普通整型,这种转换称为
整形提升

整形提升的规则:

负数的整形提升:
高位补充符号位,补1
例如:

char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,
提升之后的结果是:
11111111111111111111111111111111

正数的整形提升:
整形提升的时候,高位补充符号位,即补0
例如:

char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
提升之后的结果是:
00000000000000000000000000000001

无符号整形提升,高位补0(无符号只有正数)

二、整形提升发生的场景实例

示例1:

我们猜测一下下面这段代码的运行结果:

#include <stdio.h>
int main()
{
	char a = 5, b = 127;
	char c = a + b;
	int d = a + b;
	printf("c=%d\n", c);
	printf("d= %d", d);
	return 0;
}
运行结果:
c= -124
d= 132

原因分析:

//char a=5
//0000 0101 -- a=5
//char b=127
//0111 1111 -- b=127

因为参与了运算,并且char类型小于int型的精度,所以要进行整形提升.
整形提升后:

结果1:将结果放入char类型的变量c中,c只能存储八位
所以只保留了结果的后面八位数据即

char类型是有正负的,所以最高位为符号位,计算结果在内存中是补码的形式,我们要转化为原码.

原码的值是-124

结果2:
运算的时候经过整形提升为整形再运算,所以当结果存放在d里面的时候,直接就可以算出132.

示例 2:

补充知识:
由于我们习惯性使用十进制,当我们在定义一个整形变量a的值为10的时候习惯性写为:

int a=10;

其实也可以用其他进制表示也是一样的,例如:用16进制表示

int a=0xa;

这两种是等价的,ox是16进制的前导符,千万别把它当做数据哈.

#include <stdio.h>
int main()
{
	char a = 0xa1;
	short b = 0xb111;
	int c = 0xc1111111;
	if (a == 0xa1)
		printf("a");
	if (b == 0xb111)
		printf("b");
	if (c == 0xc1111111)
		printf("c");
	return 0;
}

试着猜一下运行的结果:

运行结果;

c

原因分析:

没错,又是整形提升在搞怪,它又偷偷将你的数据类型改了

a== 0xa1
整形提升前:1010 0001-----值为 161
整形提升后:1111 1111 1111 1111 1111 1111 1010 0001 ----是一个负数的补码,需要转化为原码
b
整形提升前:1011 0001 0001 0001 ---值为45329
整形提升后:1111 1111 1111 1111 1011 0001 0001 0001 ----是一个负数的补码,需要转化为原码
c
1100 0001 0001 0001 0001 0001 0001 0001 

整形提升之后,值肯定不一样了,所以只有没有发生整形提升的c被打印了出来.

示例3:

补充知识:
%u是按无符号整形(unsigned int)打印

猜一猜,结果吧

#include <stdio.h>
int main()
{
	char crow = 1;
	printf("%u\n", sizeof(crow));
	printf("%u\n", sizeof(+crow));
	printf("%u\n", sizeof(-crow));
	return 0;
}

运行结果:

1
4
4

看到这里,我们应该知道了,原因应该很简单吧,没错就是因为+crow和-crow相当于参与了运算,需要整形提升为int整形,所以最后两个的值为4.

三、为什么要整形提升?

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

结语

我想小伙伴应该了解整形提升了吧,下次c再偷偷改我们的类型,我们虽然不能阻止,但是却可以知道了吧.这边牛牛在本篇文章要将的全部内容啦.

下次再见,小伙伴们一起加油吧 !

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

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

相关文章

[附源码]java毕业设计石林县石漠化信息查询分析系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【GlobalMapper精品教程】020:Lidar点云数据分类(自动分类、手动分类)案例详解

航测点云通常跟DSM一致,即包含植被、房屋等信息,必须进行点云分类、过滤,才能生成准确的高程点、等高线和DEM等地形数据。本文以案例的形式详细讲解globalmapper23中点云工具及使用方法。 文章目录 1. 点云分类2. 创建地面高程格网3. 地形绘制4. 格网转点云5. 点云抽稀6. 点…

面试:java中的各种锁

共享锁 共享锁有CountDownLatch, CyclicBarrier, Semaphore, ReentrantReadWriteLock等 ReadWriteLock&#xff0c;顾名思义&#xff0c;是读写锁。它维护了一对相关的锁 — — “读取锁”和“写入锁”&#xff0c;一个用于读取操作&#xff0c;另一个用于写入操作。“读取锁…

java计算机毕业设计ssm建设路小学芙童币和芙童印章管理系统

项目介绍 随着移动互联网技术的迅速发展,时代对人们的知识水平和综合素质要求也越来越高了,各种教育管理系统层出不穷。其中以建设路小学吉祥物“芙童”为卡通原型设计的芙童印章、芙童币深受学生和老师们的喜爱。这是学校结合德育教学、少先队活动和社会实践活动为他们量身定…

Mybatis源码解析(六):一级缓存和二级缓存的优先级

Mybatis源码系列文章 手写源码&#xff08;了解源码整体流程及重要组件&#xff09; Mybatis源码解析(一)&#xff1a;环境搭建 Mybatis源码解析(二)&#xff1a;全局配置文件的解析 Mybatis源码解析(三)&#xff1a;映射配置文件的解析 Mybatis源码解析(四)&#xff1a;s…

Unity学习笔记[一] RollBall小游戏

目录 一、适配vs 二、初识Unity 2.1 unity核心模块 2.2 Unity基本操作和场景操作 2.3 世界坐标系和局部坐标系 2.4 工具栏 QWER 三、基础知识 3.1 基本组件 3.2 刚体组件 3.2.1 获取刚体组件 3.2.2 给刚体施加力 3.3 三维向量Vector3 3.4 通过按键控制左右运动 3…

【Pygame】 游戏开发 基础知识

【Pygame】 第一课 游戏开发 基础知识概述Pygame 的安装Pygame 基础命令pygame.locals 模块pygame.init()pygame.display.set_mode()案例Pygame 显示文字pygame.font.Font()fill()render()blit()pygame.display.update()案例显示英文显示中文概述 Pygame 是一个跨平台的 Pytho…

计算机网络 - 物理层数据链路层大题复习题

文章目录1、在下面给出的TCP/IP层次模型图示中填写空缺处①-⑤的协议名称。2、请写出在OSI的第几层分别处理下面的问题&#xff1f;3、试简述数据链路层的三个基本问题为什么都必须加以解决&#xff1f;4、收发两端之间的传输距离为100km&#xff0c;信号在媒体上的传播速率为2…

网络层协议数据单元-N_PDU

诊断协议那些事儿 关联文章&#xff1a; UDS的OSI模型 ISO14229各Part介绍&#xff1a;第三部分&#xff1a;CAN实施的统一诊断服务&#xff08;UDSonCAN&#xff09; UDS诊断网络层ISO15765-2&#xff08;CAN&#xff09; 功能寻址的注意事项 文章目录诊断协议那些事儿一、N_…

雅思词汇真经单词共3663个

雅思词汇真经 / Vocabulary for IELTS / 学为贵 赢未来 / 英语真经派学习法 一本书精通雅思词汇 / 刘洪波 编著 / 涵盖&#xff1a;雅思必备核心词汇刘洪波老师原创雅思考点词库 逻辑词群记忆法&#xff0c;一群一群记单词&#xff0c;快速备考无负责 时尚插图&#xff0c;趣味…

Golang实现小型CMS内容管理功能(一):Gin框架搭配Gorm实现增删查改功能

我自己开发了一款在线客服系统&#xff0c;最近一直琢磨把客服系统官网做好。因为访客来的人不少&#xff0c;大部分人可能就是看看官网界面就走了&#xff0c;怎样把这些访客留存下来&#xff0c;去测试试用客服系统&#xff0c;是我一直琢磨的问题。 官网是一个企业的门面&a…

PyQT6 pip install (三) 百篇文章学PyQT

本文章是百篇文章学PyQT的第三篇&#xff0c;本文讲述如何使用PIP安装PyQT6&#xff0c;PyQT6在安装过程中会遇到很多问题&#xff0c;博主在本篇文章中将遇到和踩过的坑总结出来&#xff0c;可以供大家参考&#xff0c;希望大家安装顺利。包括 安装、遇到问题的解决方案、怎么…

卷积运算与卷积核DLC

一、卷积运算 在数学上&#xff0c;卷积的定义是&#xff1a;两个函数在反转和位移后的乘积的积分&#xff0c;其公式表现为&#xff1a; 其中称g为过滤器&#xff0c;f为信号。 但是在深度学习中&#xff0c;卷积并不进行反转&#xff0c;而是直接进行逐元素的乘法和加法&…

【读书笔记】人月神话(一)

后续文章都是从本人的知乎博客上搬迁过来。 在软件领域&#xff0c;布鲁克斯博士的《人月神话》是一本关于大型项目管理的经典之作。这本书不仅对每一个软件行业的项目经理(PM)来说是一本必读读物&#xff0c;对每个软件行业的参与者(程序员&#xff0c;测试人员或者是创业者)…

详解c++---类和对象(三)

目录标题拷贝构造函数为什么会有该函数拷贝构造的特性第一个性质的详解第二个性质详解第三个性质的详解什么时候得自己写拷贝构造函数哪些场景会用到拷贝构造函数运算符重载函数为什么会有运算符重载运算符重载的形式>和>的运算符重载和的运算符的重载-和-的运算符重载运…

用anacnda创建虚拟环境用不用指定python版本

用anaconda创建了python虚拟环境以后&#xff0c;想用pycharm指定这个python解释器。 首先&#xff0c;在我创建虚拟环境并未指定python版本的情况下&#xff0c;在使用anaconda prompt的命令 conda create -n envs_name&#xff08;未指定python版本&#xff09;以后&#xff…

智能油井在线监控解决方案,第一时间掌握所有动态

随着物联网、云计算等技术的不断革新&#xff0c;物联网技术已经渗透到工业生产的方方面面。例如智能油井&#xff1b;油田地域广阔&#xff0c;分布着大量各种油井&#xff0c;油井开采设备的连续稳定运行是保证石油开采的首要条件。但是油井生产过程中&#xff0c;各井之间距…

C++ 多线程 线程安全队列设计

这是看《C并发编程实战》这本书学的&#xff0c;这里我要为这本书辟谣一下&#xff0c;虽然是这本书前面翻译得很烂&#xff0c;但是从第6章开始&#xff0c;应该是换了个人翻译&#xff0c;虽然还是能难懂&#xff0c;但是难懂的是代码逻辑&#xff0c;而不是语言逻辑&#xf…

MySQL8.0优化 - 锁 - 全局锁、死锁

文章目录学习资料锁的不同角度分类锁的分类图如下其他锁之&#xff1a;全局锁其他锁之&#xff1a;死锁概念产生死锁的必要条件如何处理死锁如何避免死锁学习资料 【MySQL数据库教程天花板&#xff0c;mysql安装到mysql高级&#xff0c;强&#xff01;硬&#xff01;-哔哩哔哩…

Java——继承下的抽象类与接口

文章目录壹、抽象类贰、接口前言&#xff1a; 我们前一章写了继承性&#xff0c;这一章节&#xff0c;一起来学习Java中的抽象类与接口相关知识。 壹、抽象类 1、定义&#xff1a;用关键字abstract修饰的类称为抽象类&#xff08;abstract类&#xff09;。 2、格式&#xff1…