截断整型提升算数转换

请添加图片描述

文章目录

  • 🚀前言
  • 🚀截断
  • 🚀整型提升
    • ✈️整型提升是怎样的
  • 🚀算术转换

🚀前言

大家好啊!这里阿辉补一下前面操作符遗漏的地方——截断、整型提升和算数转换
看这一篇要先会前面阿辉讲的数据的存储否则可能看不懂
不bb了,铁子们开始今天的学习吧!!!

🚀截断

截断:将数据存储在计算机系统中时,由于存储空间的限制或数据类型的限制,数据可能会被截断或缩减

上面的话什么意思呢?
比如一个int类型的数据有32bit位把它放在char类型类型的变量中,但是char类型仅有8bit位,这时高位将被截断,只保留低位的8bit位
同样地,当一个浮点数超出了系统所能表示的范围时,它的小数部分将被截断,只保留有效数字。在字符和字符串的情况下,如果存储空间不足,则会截断字符串的末尾字符或字符串的一部分

例子👇

char c = 0x01020304;//十进制数
return 0;

打开VS中的内存窗口我们看一下c里面存的是啥
在这里插入图片描述

内存窗口是以十六进制形式展示的,c里面仅仅存的是04,发生了截断,前面的十六进制的010203全都截断了

🚀整型提升

C语言中整型算术运算总是至少以缺省整型类型(int)的精度来进行的

缺省就是默认的意思

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
这是为什么?

因为表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度⼀般就是int的字节长度,同时也是CPU的通用寄存器的长度
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度

✈️整型提升是怎样的

对于整型提升分为两种情况:

  • 有符号数整型提升高位补符号位
  • 无符号数高位直接补0

给铁子们上例子👇

//负数的整形提升
char c1 = -1;
变量c1的⼆进制位(补码)中只有8个⽐特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的⼆进制位(补码)中只有8个⽐特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//⽆符号整形提升,⾼位补0

下面这段代码,铁子们知道会输出什么嘛

int main()
{char a = 127;char b = 1;char c = a + b;printf("%d\n", a + b);printf("%d\n", c);return 0;
}

输出结果:

128
-128

为什么呢?

因为a+b计算的时候发生了整型提升
127补码->00000000000000000000000001111111
1  补码->00000000000000000000000000000001
a + b->00000000000000000000000010000000 -> 128
但是把这个值赋给char类型的c时会发生截断
c里面存的就是10000000,由于char在VS中是有符号char
所以在用%d打印c时发生整型提升高位补1
11111111111111111111111110000000 ->补码
10000000000000000000000001111111 
10000000000000000000000010000000 ->原码-> -128

🚀算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。算数转换是针对字节数大于等于整型的类型来说的。下面的层次体系称为寻常算术转换

  long doubledoublefloatunsigned long intlong intunsigned intint

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。也就是说:算数转换就高不就低,会把低的转换成高的,也就是把字节数小的转换成字节数大的


如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主,如有不足还请指点,博主及时改正,感谢大家支持!!!

请添加图片描述

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

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

相关文章

绑定Open AI api-key获取token要怎么操作?

要绑定OpenAI的付费计划并获取API key来调用token接口,你需要按照以下步骤操作: 1. 访问OpenAI官网: 打开浏览器,输入 https://openai.com/,并访问OpenAI的官方网站。 2. 注册/登录账户: 如果你还没有Ope…

揭秘亚马逊中国站API接口:挖掘无限商机,实现高效数据获取

一、概述 亚马逊中国站API接口是一种应用程序接口,允许开发者通过编程方式访问亚马逊中国站的数据和服务。通过使用API接口,开发者可以轻松地获取商品信息、用户数据、订单状态等,从而为他们的应用程序或网站提供更加丰富的内容和功能。 二…

T-Dongle-S3开发笔记——相关配置

portTICK_PERIOD_MS设置 Flash配置 Flash SPI mode 默认是DIO,改为QIO (W25Q128支持QIO) DIO与QIO区别: esp8266,esp32中的SPI FLASH 访问模式(QIO QOUT DIO DOUT)_qio dio-CSDN博客 Dual SPI:MOSI 和 MISO 引脚…

Spring Boot Security认证:Redis缓存用户信息

文章目录 1. 引言2. Spring Boot Security简介3. 集成Spring Boot Security4. 配置Spring Boot Security5. Redis配置6. Redis缓存用户信息7. 使用Redis缓存的用户信息进行认证8. 测试认证功能9. 性能优化与拓展9.1 性能优化9.2 拓展功能 10. 总结 🎉欢迎来到架构设…

Gradle下载地址

Gradle下载地址 Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,Gradle也是第一个构建集成工具,与ant、maven、ivy有良好的相容相关性。支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库…

【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化

字符串匹配算法是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目,本文主要介绍BF算法(最好想到的算法,也最好实现)和KMP算法(最经典的) 一、BF算法 BF算法,即暴力(Bru…

Matplotlib_Matplotlib初相识

一、认识matplotlib: Matplotlib是一个Python 2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种静态,动态,交互式的图表。 Matplotlib可用于Python脚本,Python和IPy…

Java多线程技术五——单例模式与多线程

1 概述 本章的知识点非常重要。在单例模式与多线程技术相结合的过程中,我们能发现很多以前从未考虑过的问题。这些不良的程序设计如果应用在商业项目中将会带来非常大的麻烦。本章的案例也充分说明,线程与某些技术相结合中,我们要考虑的事情会…

微信公众号怎么开评论功能?

为什么公众号没有留言功能?2018年2月12日之后直到现在,新注册公众号的运营者会发现一个问题:无论是个人还是企业的公众号,在后台都找不到留言功能了。这对公众号来说绝对是一个极差的体验,少了一个这么重要的功能&…

阶段七-GitEE

Git:版本控制软件 Git的优点 1.1 协同修改 多人并行不悖的修改服务器端的同一个文件。 1.2 数据备份 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。 1.3 版本管理 在保存每一个版本的文件信息的时候要做到不保存重复数据&…

C语言--直接插入排序【排序算法|图文详解】

一.直接插入排序介绍🍗 直接插入排序又叫简单插入排序,是一种简单直观的排序算法,它通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法描述: 假设要排序…

Linux:线程优先级设置

目录 一、背景二、调整普通线程的优先级通过系统命令通过Linux C代码 三、调整实时线程的优先级通过系统命令通过Linux C代码 四、参考资料(建议一定要阅读) 在操作系统中,线程优先级决定了线程在 CPU 调度时的重要性。较高优先级的线程会在竞…