当前位置: 首页 > news >正文

整型之韵,数之舞:大小端与浮点数的内存之旅

在这里插入图片描述
✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论

个人主页:秋邱’博客

所属栏目:人工智能

(感谢您的光临,您的光临蓬荜生辉)

1.0 整形提升

我们先来看看代码。

int main()
{char a = 3;char b = 127;char c = a + b;pritnf("%d", c);return 0;
}

这是char类型的相加,但你以为答案是130,那就是错了,事实没那么简单。

1.1 什么是整形提升

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

1.2 如何整形提升?

规则:

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的
  2. ⽆符号整数提升,⾼位补0

打印结果:

-126

分析

	char a = 3;00000000000000000000000000000011  //3的二进制00000011 char achar b = 127;00000000000000000000000001111111  //127的二进制01000000 char bchar c = a + b;00000011 char a01000000 char b  //这里还不能直接相加,要对a和b进行整形提升//在vs下char是有符号的char,所以对char a进行整形的提升,符号位是000000000000000000000000000000011 //char a的整形提升//同理,char b也是有符号的char,符号位是000000000000000000000000001111111 //char b的整形提升00000000000000000000000010000010 //a + b,d但是char c中只能存放8个比特位10000010 //char cprintf("%d", c);//%d是按十进制打印有符号的整数,但我们是char c,所以需要进行整形提升//char c是有符号数,最高位是1全补1.11111111111111111111111110000010 //char c整形提升的结果(补码)//打印的方式是原码,我们要对c补码进行,取反+100000000000000000000000001111110 //原码//结果是-127

1.3 整形提升的意义

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

也就是说,小于整形的类型就要进行提升。

注意:char的是unsigned char 还是 signed char ,这是不确定的,而是取决于编译器。
但常见的编译器上char 一般都是signed char。

2.0 算术转换

如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类
型,否则操作就⽆法进⾏。下⾯的层次体系称为寻常算术转换

long double
double
float
unsigned long int
long int
unsigned int
int

如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏
运算。

3.0 大小端

3.1 什么是大小端

大端小端是计算机存储数据的一种方式。在内存中,数据被分割为多个字节进行存储。大小端指的是字节的存储顺序。

大端存储是指高位字节被存储在低位地址,低位字节存储在高位地址。大端存储方式常用于网络协议中。

小端存储是指低位字节被存储在低位地址,高位字节存储在高位地址。小端存储方式常用于x86架构的计算机。
在这里插入图片描述我们在vs2022提示可知,vs2022中采用的是小端存储的方式。

图示:

在这里插入图片描述
接下里我们用程序来判断vs2022里的是大端还是小端。

3.2 判断大小端

3.2.1指针判断

#include<stdio.h>
int check_sys()
{int i = 1;return *(char*)&i;}
int main()
{int ret = check_sys();if (ret == 1){printf("小端");}else{printf("大端");}return 0;
}

3.2.2联合体判断

int check_sys()
{union check {char j;int i;};union check u = { 0 };u.j = 1;return u.j;}
int main()
{int ret = check_sys();if (ret == 1){printf("小端");}else{printf("大端");}return 0;
}

打印结果:

小端

3.3大小端的意义

我们知道了大小端,然后有什么用呢?

  1. 确保数据传输的准确性:在不同系统或设备之间进行数据交换时,了解大小端可以确保数据被正确解释。
  2. 兼容不同的系统:有助于软件在各种平台上的移植和运行。
  3. 优化性能:根据大小端特点进行针对性的优化。
  4. 调试和排错:当出现数据解析问题时,能更快地定位问题。
  5. 理解系统架构:加深对计算机系统内部工作原理的理解。
  6. 网络通信:确保网络协议的正确实现和数据的无误传输。
  7. 硬件设计:对硬件设计和开发具有指导意义。
  8. 数据恢复:在数据恢复过程中,正确解读存储的数据。
  9. 提高编程效率:避免因大小端问题导致的错误。
  10. 增强系统安全性:防止因数据解读错误引发的安全漏洞。

两种存储方式的区别在于字节的存储顺序,对于单个字节的操作没有影响,但对于多个字节的数据,如整数和浮点数,字节顺序的不同会导致数据的解释和处理方式不同。因此,当不同大小端的计算机之间进行数据传输时,需要进行字节序的转换。

4.0浮点数在内存中的存储

浮点数在内存中的存储是怎么样的呢,跟整形的存储一样吗?答案:不是!接下里往下看。

4.1 浮点数的存储

根据国际标准IEEE(电⽓和电⼦⼯程协会)754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:

V = (−1) ^S*M *2^E
• (-1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M表⽰有效数字,M是⼤于等于1,⼩于2的
• 表⽰指数位

二进制对应的十进制图
在这里插入图片描述
举例
⼗进制的5.0,写成⼆进制是101.0 ,相当于1.01×2^2 。
那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。
⼗进制的-5.0,写成⼆进制是-101.0 ,相当于-1.01×2^2 。那么,S=1,M=1.01,E=2。
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。

float类型浮点数内存分配
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1b0c0e99b9084031924925b93dc6b415.png)
double类型浮点数内存分配
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6cf9f51a9a614d388262edfa1a31cc8b.png)

4.2 浮点数存的过程

IEEE 754对有效数字M和指数E,还有⼀些特别规定。
对于M
1≤M<2 ,也就是说,M可以写成1.xxxxxx 的形式,其中xxxxxx
表⽰⼩数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的xxxxxx部分。⽐如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。这样做的⽬的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。
对于E
,E为⼀个⽆符号整数(unsignedint)
这意味着,如果E为8位,它的取值范围为0255;如果E为11位,它的取值范围为02047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。⽐如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

4.3 浮点数取的过程

指数E取出内存,情况有三。
1.E不全为0或不全为1
这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1。
⽐如:0.5的⼆进制形式为0.1,由于规定正数部分必须为1,即将⼩数点右移1位,则为1.0*2^(-1),其阶码为-1+127(中间值)=126,表⽰为01111110,⽽尾数1.0去掉整数部分为0,补⻬0到23位00000000000000000000000,则其⼆进制表⽰形式为:

 0 01111110 00000000000000000000000

2.E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字。

0 00000000 00100000000000000000000

3.E全为1
这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s);

0 11111111 00010000000000000000000

这一篇到这里就完结了,感谢各位的观看。

相关文章:

整型之韵,数之舞:大小端与浮点数的内存之旅

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱’博客 所属栏目&#xff1a;人工智能 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 1.0 整形提升 我们先来看看代码。 int main() {char a 3;char b 127;char …...

变量作用域

变量作用域 标识符的作用域是定义为其声明在程序里的可应用范围, 或者即是我们所说的变量可见性。换句话说,就好像在问你自己,你可以在程序里的哪些部分去访问一个制定的标识符。变量可以是局部域或者全局域。 全局变量与局部变量 定义在函数内的变量有局部作用域,在一个…...

数据结构:链表的双指针技巧

文章目录 一、链表相交问题二、单链表判环问题三、回文链表四、重排链表结点 初学双指针的同学&#xff0c;请先弄懂删除链表的倒数第 N 个结点。 并且在学习这一节时&#xff0c;不要将思维固化&#xff0c;认为只能这样做&#xff0c;这里的做法只是技巧。 一、链表相交问题 …...

用WHERE命令可以在命令行搜索文件

文章目录 用WHERE命令可以在命令行搜索文件概述笔记没用的小程序END 用WHERE命令可以在命令行搜索文件 概述 想确认PATH变量中是否存在某个指定的程序(具体是在PATH环境变量中给出的哪个路径底下?). 开始不知道windows有where这个命令, 还自己花了2个小时写了一个小程序. 后…...

持续交付/持续部署流水线介绍(CD)

目录 一、概述 二、典型操作流程 2.1 CI/CD典型操作流 2.2 CI/CD操作流程说明 2.3 总结 三、基于GitHubDocker的持续交付/持续部署流水线&#xff08;公有云&#xff09; 3.1 基于GitHubDocker的持续交付/持续部署操作流程示意图 3.2 GitHubDocker持续交付/持续部署流水…...

第四百三十八回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 们在上一章回中介绍了"不同平台上换行的问题"相关的内容&#xff0c;本章回中将介绍如何在页面上显示蒙板层.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们…...

Python学习:面相对象

面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实…...

SSM学习——Spring AOP与AspectJ

Spring AOP与AspectJ 概念 AOP的全称为Aspect-Oriented Programming&#xff0c;即面向切面编程。 想象你是汉堡店的厨师&#xff0c;每一份汉堡都有好几层&#xff0c;这每一层都可以视作一个切面。现在有一位顾客想要品尝到不同风味肉馅的汉堡&#xff0c;如果按照传统的方…...

Android 使用LeakCanary检测内存泄漏,分析原因

内存泄漏是指无用对象&#xff08;不再使用的对象&#xff09;持续占有内存或无用对象的内存得不到及时释放&#xff0c;从而造成内存空间的浪费称为内存泄漏。 平时我们在使用app时&#xff0c;少量的内存泄漏我们是发现不了的&#xff0c;但是当内存泄漏达到一定数量时&…...

Linux部署Kafka2.8.1

安装Jdk 首先确保你的机器上安装了Jdk&#xff0c;Kafka需要Java运行环境&#xff0c;低版本的Kafka还需要Zookeeper&#xff0c;我此次要安装的Kafka版本为2.8.1&#xff0c;已经内置了一个Zookeeper环境&#xff0c;所以我们可以不部署Zookeeper直接使用。 1、解压Jdk包 t…...

【pytest、playwright】allure报告生成视频和图片

目录 1、修改插件pytest_playwright 2、conftest.py配置 3、修改pytest.ini文件 4、运行case 5、注意事项 1、修改插件pytest_playwright pytest_playwright.py内容如下&#xff1a; # Copyright (c) Microsoft Corporation. # # Licensed under the Apache License, Ver…...

浅谈iOS开发中的自动引用计数ARC

1.ARC是什么 我们知道&#xff0c;在C语言中&#xff0c;创建对象时必须手动分配和释放适量的内存。然而&#xff0c;在 Swift 中&#xff0c;当不再需要类实例时&#xff0c;ARC 会自动释放这些实例的内存。 Swift 使用 ARC 来跟踪和管理应用程序的内存&#xff0c;其主要是由…...

Spring IoCDI(2)

IoC详解 通过上面的案例, 我们已经知道了IoC和DI的基本操作, 接下来我们来系统地学习Spring IoC和DI的操作. 前面我们提到的IoC控制反转, 就是将对象的控制权交给Spring的IoC容器, 由IoC容器创建及管理对象. (也就是Bean的存储). Bean的存储 我们之前只讲到了Component注解…...

30. UE5 RPG GamplayAbility的配置项

在上一篇文章&#xff0c;我们介绍了如何将GA应用到角色身上的&#xff0c;接下来这篇文章&#xff0c;将主要介绍一下GA的相关配置项。 在这之前&#xff0c;再多一嘴&#xff0c;你要能激活技能&#xff0c;首先要先应用到ASC上面&#xff0c;才能够被激活。 标签 之前介绍…...

提升自己最快的方式是什么?

提升自己最快的方式通常涉及到个人成长的各个方面&#xff0c;包括心理、情感、技能和知识等。根据查阅到的资料&#xff0c;以下是一些具体的方法和步骤&#xff0c;帮助你快速提升自己&#xff1a; 1. 培养屏蔽力 荷兰畅销书作家罗伊马丁纳提到&#xff0c;屏蔽力是个人成长…...

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

题目&#xff1a;一个5位数&#xff0c;判断它是不是回文数。即12321是回文数&#xff0c;个位与万位相同&#xff0c;十位与千位相同。    There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence…...

《HelloGitHub》第 96 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …...

C++tuple类型

tuple 类型 tuple是类似pair的模板。 每个pair的成员类型都不相同&#xff0c;但每个pair都恰好有两个成员。不同tuple类型的成员类型也不相同&#xff0c;但一个tuple可以有任意数量的成员。 每个确定的tuple类型的成员数目是固定的&#xff0c;但一个tuple类型的成员数目可…...

亚远景科技-浅谈ASPICE标准和ASPICE认证/评估

ASPICE&#xff08;Automotive SPICE&#xff09;是一种针对汽车行业的软件开发过程的评估模型&#xff0c;它旨在帮助汽车制造商和供应商提高软件开发过程的能力和质量&#xff0c;从而提升产品的质量、安全性和效率。 ASPICE标准涵盖了软件开发的各个阶段和活动&#xff0c;…...

PHP性能提升方案

一、背景与介绍 PHP语言开发效率高&#xff0c;特别应用于适合中小型项目&#xff0c;对于创业初期敏捷开发验证项目可行性或者Demo演示绝对占据优势。 但是随着现在Web应用的复杂性&#xff0c;针对项目要适应高并发、高流量的访问特性&#xff0c;PHP确实在性能方面相对Go、J…...

【收藏】2026测试人必看!再不学大模型AI,真的要被行业淘汰了

最近和身边做测试的朋友闲聊&#xff0c;发现大家的焦虑感比往年更重了——有人做了3年功能测试&#xff0c;跳槽面试连初筛都过不了&#xff1b;有人深耕性能测试5年&#xff0c;薪资原地踏步&#xff0c;反而被刚入行、懂AI测试的新人弯道超车。 从ChatGPT横空出世引爆AI行业…...

Cursor Pro永久免费使用终极指南:如何绕过试用限制完整教程

Cursor Pro永久免费使用终极指南&#xff1a;如何绕过试用限制完整教程 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached you…...

SITS 2026图计算方案深度解析,独家披露金融风控与生物医药两大场景的GNN工程化适配矩阵(含12个可复用配置模板)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生图计算应用&#xff1a;SITS 2026图神经网络工程化方案 SITS 2026 是面向大规模动态图场景的AI原生图计算框架&#xff0c;深度融合GNN训练、图拓扑实时更新与边缘-云协同推理能力。其核心设计摒…...

工作进度管理工具有哪些?8款项目协作平台测评分享

本文将深入对比8款工作任务进度管理软件&#xff1a;Worktile、PingCode、Jira Confluence、Asana、monday.com、ClickUp、Trello、Microsoft Planner / Project。一、工作任务进度管理软件怎么选很多企业刚开始选任务管理软件时&#xff0c;容易只看两个点&#xff1a;能不能…...

软件需求捕获:从Therac-25悲剧到安全关键系统开发的脊柱工程

1. 项目概述&#xff1a;从Therac-25悲剧到现代软件安全基石上世纪90年代中期&#xff0c;一系列由Therac-25放射治疗机引发的致命事故&#xff0c;最终催生了一场由华盛顿大学Nancy Leveson教授主导的正式调查。这场调查的结论&#xff0c;远不止于揪出一款医疗设备的软件缺陷…...

Super IO插件:Blender文件操作效率革命,从繁琐拖拽到智能粘贴

Super IO插件&#xff1a;Blender文件操作效率革命&#xff0c;从繁琐拖拽到智能粘贴 【免费下载链接】super_io blender addon for copy paste import / export 项目地址: https://gitcode.com/gh_mirrors/su/super_io Super IO是一款革命性的Blender插件&#xff0c;通…...

STM32实战:用HAL库搞定RS485 Modbus液压传感器数据采集(附自动收发电路避坑)

STM32实战&#xff1a;HAL库驱动RS485 Modbus液压传感器全流程解析 液压系统压力监测的稳定性往往取决于传感器数据采集的可靠性。在工业现场&#xff0c;RS485总线搭配Modbus RTU协议已成为液压传感器数据传输的黄金标准。本文将深入探讨基于STM32 HAL库的完整解决方案&#x…...

从Anaconda虚拟环境到Docker镜像:一份给数据科学家的迁移指南(避坑Dockerfile编写)

从Anaconda到Docker&#xff1a;数据科学家的环境迁移实战手册 当你的机器学习模型在本地运行良好&#xff0c;却在同事的电脑上频频报错时&#xff1b;当论文评审要求提供可复现的实验环境时&#xff1b;当需要将训练好的模型部署到云服务器时——conda虚拟环境的局限性便开始…...

别再只会用cv2.resize()了!手把手教你用Python复现最近邻和双线性插值(附完整代码)

从零实现图像缩放&#xff1a;深入理解最近邻与双线性插值的数学本质 当你在Jupyter Notebook里轻松敲下cv2.resize(img, (300,300))时&#xff0c;有没有想过这个看似简单的操作背后隐藏着怎样的数学魔法&#xff1f;今天我们将撕开OpenCV的封装外壳&#xff0c;用纯Python和N…...

冥想第一千八百七十八天(1878)

1.周二&#xff0c;5.12日&#xff0c;天气晴朗&#xff0c;下午阴&#xff0c;项目上全力以赴的一天。今天是休息日&#xff0c;下班带溪溪去游泳。 2.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不断进步的自己。...