整数和浮点数的存储

整数的存储

整数的存储分为有符号和无符号的整数的存储,整数2进制的表示方法有三种,分别是原码、反码、补码,内存中存储的是补码,反码可以理解为是一个中转站,原码就是直接将数值按照正负形式翻译成的二进制数字

有符号整形(对于有符号整形中的正数,原反补码一样,同无符号整形一个规则)
对于有符号的整数,对应的二进制最高位表示符号位,其余才表示数值位
原码:数值按照正负形式翻译得到二进制数字
反码:符号位不变,其余按位取反
补码:反码加一
转化规则:原码 -> 补码 和 补码 -> 原码 规则一样都是按位取反,然后加一

无符号整形和正数
原码和反码和补码一样,因为不用考虑符号,存储的都是有效数据,一律都是加法,所以,不用像有符号整型那样,有取反和加一的规则

**整数存储的顺序(大小端模式)**
  • 大端:高位存储在低地址,低位存储在高地址

  • 小端:高位存储在高地址,低位存储在低地址

    在这里插入图片描述

对于整形来说:内存中存放的是数据的补码

  • 计算机系统中,数值一律用补码来表示和存储,因为使用补码可以将符号位和数值域统一处理
  • 符号位的存在使得加法和减法得到了统一处理,(CPU只有加法器),统一转化为加法
  • 补码与原码可以相互转化,其运算过程是相同的,不需要而额外电路

整数存储的练习

练习1 
//判断大小端
#include <stdio.h>
int check_sys()
{int i = 1;int ret = *((char*)&i);if (1 == ret)return 1;elsereturn 0;
}
int main()
{if (check_sys())printf("小端\n");elseprintf("大端\n");return 0;
}

在这里插入图片描述
练习2

#include <stdio.h>
int main()
{char a = -1;signed char b = -1;unsigned char c = -1;printf("a=%d,b=%d,c=%d", a, b, c);}

在这里插入图片描述
解释

#include <stdio.h>
int main()
{char a = -1;//原码 -1: 10000000 00000000 00000000 00000001//反码 -1: 11111111 11111111 11111111 11111110//补码 -1: 11111111 11111111 11111111 11111111//截断a: 11111111signed char b = -1;//截断a: 11111111 unsigned char c = -1;//截断a: 11111111printf("a=%d,b=%d,c=%d", a, b, c);//输出a 整形提升//补码 11111111  高位补符号位//补码 11111111 11111111 11111111 11111111//反码 11111111 11111111 11111111 11111110//原码 10000000 00000000 00000000 00000001  -1//输出b 整形提升// b同a -1//输出c 整形提升//补码 11111111  高位补0(无符号整形)//补码 00000000 00000000 00000000 11111111 (正数)//反码 00000000 00000000 00000000 11111111//原码 00000000 00000000 00000000 11111111 255return 0;
}
练习3
#include <stdio.h>
int main()
{char a = -128;//原 -128: 10000000 00000000 00000000 10000000//反 -128: 11111111 11111111 11111111 01111111//补 -128: 11111111 11111111 11111111 10000000//截断 a: 10000000printf("%u\n", a);//补码: 11111111 11111111 11111111 10000000 (整形提升)//反码: 11111111 11111111 11111111 10000000//原码: 11111111 11111111 11111111 10000000return 0;
}

在这里插入图片描述

练习4

//练习4
#include <stdio.h>
#include <string.h>
int main()
{char a[1000];int i = 0;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%zd", strlen(a));//数组a存储的是-1到-1000吗 还是什么//a的长度是多少//char 的范围为-128到127//-1 -2 ... -128 127 ... 2 1 0// 255return 0;
}

在这里插入图片描述

练习5

#include <stdio.h>
int main()
{unsigned char i = 0;for (i = 0; i <= 255; i++){printf("hello world\n");}//死循环//unsigned char 0-255 不会超过255return 0;
}
#include <stdio.h>
int main()
{unsigned int i;for (i = 9; i >= 0; i--){printf("%u\n", i);}//死循环//unsigned int 不会小于0//一直输出return 0;
}

练习6

#include <stdio.h>
//x86 小端模式
int main()
{int a[4] = { 1,2,3,4 };int* ptr2 = (int*)((int)a + 1);printf("%x",  *ptr2);//%x打印16进制//ptr2//数组a的地址转化为int类型,//01 00 00 00  02 00 00 00  03 00 00 00  04 00 00 00return 0;
}

在这里插入图片描述

在这里插入图片描述

浮点数的存储

浮点数的存储不同于整数存储,没有原码反码补码概念,他的存储是按照国际标准IEEE754,即任意一个二进制浮点数V都可以表示为如下形式
V = (-1)^ S * M * 2 ^ E
  • (-1) ^ S 表示符号位,当S=0,V为整数;当S=1,V为负数

  • M表示有效数字,M>=1&&M<2,使用科学计数法

  • 2^E表示指数位

    举例
    在这里插入图片描述

IEEE754规定:
对于32位的浮点数,最高位存储符号位S,接着8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最高位存储符号位S,接着11位存储指数E,剩下的52位存储有效数字M
在这里插入图片描述
在这里插入图片描述
浮点数存储过程
IEEE754 对有效数字M和E,有一些特别规定
M>=1&&M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分,但在计算机内部保存时,IEEE754规定:默认M的第一个数为1,舍去存储,只保存小数部分。比如保存1.01时,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的是,节省一位有效数字。

对于指数E要分情况考虑(E是一个无符号整数)

如果E为8位,他的表示范围就是0-255,如果E为11位的话,表示范围就是0-2047。但是,由于科学及算法可以出现负数,这与E的定义有矛盾,所以IEEE754就规定,存入内存时E的真实值必须加上一个中间数,对于8位E,中间数为127,对于11位E,中间数为023。比如,2^10的E是10,保存为32位浮点数是,内存中必须存储为10+127=137,即10001001。

浮点数读取过程
指数E从内存中读取还可以分为三种情况

E不全为0或不全为1(正常情况)

由于上面内存中存储E是加上了中间值,因此读取时会减掉中间值,得到真实值,再将有效数字M加上1。
比如:0.5的二进制形式为0.1,由于规定整数部分必须为1,所以小数点要向右移一位,即为1.0^2(-1),其内存中的E为-1+127(中间值),表示为01111110,而M去掉正数部分为0,补齐0到23位
00000000000000000000000
在这里插入图片描述
E全为0
浮点数的指数E为-127(-中间值),内存中才会存储为全是0,这是读取有效数字M不再加上1,还原为0.xxxxxx的小数。这样做是为了表示无限接近0,以及接近于0的很小数字。

E全为1
这时内存中的E全为1,如果是32位浮点数,E则为128,2^128,这时尾数部分如果为0,则表示无限大。

## 整数和浮点数的存储规则理解就可以,尤其是对于浮点数来说注重理解,千万不要死记硬背

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

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

相关文章

<论文>时序大模型如何应用于金融领域?

一、摘要 本文介绍2024年的论文《Financial Fine-tuning a Large Time Series Model》&#xff0c;论文探索了主流的时间序列大模型在金融领域的微调应用实践&#xff0c;为时序大模型的领域微调提供了参考。 译文&#xff1a; 大型模型在自然语言处理、图像生成以及近期的时间…

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 &#x1f4cc;补充&#xff1a; &#x1f4cc;通常网络中用高低电平&#xff0c;磁盘中用磁化方向来表示。以下是具体说明&#xff1a; &#x1f4cc;如果有一块磁盘要进行销毁该怎么办&#xff1f; 1-2 磁盘存储结构 ​编辑…

UML系列之Rational Rose笔记七:状态图

一、新建状态图 依旧是新建statechart diagram&#xff1b; 二、工作台介绍 接着就是一个状态的开始&#xff1a;开始黑点依旧可以从左边进行拖动放置&#xff1a; 这就是状态的开始&#xff0c;和活动图泳道图是一样的&#xff1b;只能有一个开始&#xff0c;但是可以有多个…

快速上手 INFINI Console 的 TopN 指标功能

背景 在分布式搜索引擎系统&#xff08;如 Easysearch、Elasticsearch 和 OpenSearch&#xff09;中&#xff0c;性能监控至关重要。为了确保系统的高效运行和资源的合理分配&#xff0c;我们通常需要关注一段时间内关键资源的使用情况&#xff0c;特别是索引、节点和分片的内…

springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)

线上预览: 移动端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小红书凭借优秀的产品体验 和超高人气 目前成为笔记类产品佼佼者 此项目将详细介绍如何使用Vue.js和Spring Boot 集合uniapp 开发一个仿小红书应用&#xff0c;凭借uniapp 可以在h5 小程序 app…

面向对象分析与设计Python版 分析与设计概述

文章目录 一、软件工程概述二、分析与设计概述三、领域模型 一、软件工程概述 高质量软件系统的基本要求 架构性内聚可重用性可维护性可扩展性灵活性 软件开发过程模型&#xff1a;是指根据软件开发项目从开始到结束的一系列步骤和方法&#xff0c;建模为不同的模型。常见的…

3D目标检测数据集——Waymo数据集

Waymo数据集簡介 发布首页&#xff1a;https://waymo.com/open/ 论文&#xff1a;https://openaccess.thecvf.com/content_CVPR_2020/papers/Sun_Scalability_in_Perception_for_Autonomous_Driving_Waymo_Open_Dataset_CVPR_2020_paper.pdf github&#xff1a;https://github.…

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器&#xff0c;为开发者提供了一个强大的平台来实施这些实践。然而…

基于“大型园区”网络设计

基于“大型园区”网络设计 目 录 第1章 项目概述1 1.1 项目背景1 1.2 公司概况1 1.3 网络现状2 第2章 需求分析4 2.1 部门需求4 2.2 配置需求4 2.3 网络功能需求5 第3章 网络设计6 3.1 建设原则6 3.2 网络拓扑结构6 3.3 IP地址和VLAN划分8 3.4 核心层设计9 3.5 …

回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测

回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测 目录 回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 RVM-Adaboost相关向量机集成学习多输入单输出回归预测是一种先进…

力扣经典练习题之70.爬楼梯

今天继续给大家分享一道力扣的做题心得今天这道题目是70.爬楼梯 题目如下&#xff1a; 题目链接&#xff1a;70.爬楼梯 1&#xff0c;题目分析 这个题目是一个经典的动态规划问题&#xff0c;它帮助我们理解如何通过分解问题来找到解决方案。在现实生活中&#xff0c;很多复杂…

Vue学习二——创建登录页面

前言 以一个登录页面为例子&#xff0c;这篇文章简单介绍了vue&#xff0c;element-plus的一些组件使用&#xff0c;vue-router页面跳转&#xff0c;pinia及持久化存储&#xff0c;axios发送请求的使用。后面的页面都大差不差&#xff0c;也都这么实现&#xff0c;只是内容&am…

ZYNQ初识10(zynq_7010)UART通信实验

基于bi站正点原子讲解视频&#xff1a; 系统框图&#xff08;基于串口的数据回环&#xff09;如下&#xff1a; 以下&#xff0c;是串口接收端的波形图&#xff0c;系统时钟和波特率时钟不同&#xff0c;为异步时钟&#xff0c;&#xff0c;需要先延时两拍&#xff0c;将时钟同…

java小知识点总结

一、比特流的本质就是数组 二、位运算 位运算就是CPU的底层原理&#xff0c;半导体电路进行位运算 位运算涉及一些算法&#xff0c;&和^ ^ 异或 两变量交换值&#xff0c;不依赖第三个变量 x^s k 异或知道两者就能推另一个 a a<<2就是乘以2的多少次方 相反 a…

vue3后台系统动态路由实现

动态路由的流程&#xff1a;用户登录之后拿到用户信息和token&#xff0c;再去请求后端给的动态路由表&#xff0c;前端处理路由格式为vue路由格式。 1&#xff09;拿到用户信息里面的角色之后再去请求路由表&#xff0c;返回的路由为tree格式 后端返回路由如下&#xff1a; …

贪心算法笔记

贪心算法笔记 大概内容 贪心就是对于一个问题有很多个步骤,我们在每一个步骤中都选取最优的那一个,最后得出答案。就是在一些函数中可行,但是有些比如二次函数,因为它的转折点不一定最优,就是不可行的。那么如何判断贪心呢?有这么几种 看时间复杂度,一般的就是 O ( n…

CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞

漏洞描述 GiveWP 插件中发现了一个严重漏洞&#xff0c;该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777&#xff0c;CVSS 评分为 9.8&#xff0c;表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装&#xff0c;为全球无数捐赠平…

ubuntu官方软件包网站 字体设置

在https://ubuntu.pkgs.org/22.04/ubuntu-universe-amd64/xl2tpd_1.3.16-1_amd64.deb.html搜索找到需要的软件后&#xff0c;点击&#xff0c;下滑&#xff0c; 即可在Links和Download找到相关链接&#xff0c;下载即可&#xff0c; 但是找不到ros的安装包&#xff0c; 字体设…

细说STM32F407单片机以DMA方式读写外部SRAM的方法

目录 一、工程配置 1、时钟、DEBUG、GPIO、CodeGenerator 2、USART3 3、NVIC 4、 FSMC 5、DMA 2 &#xff08;1&#xff09;创建MemToMem类型DMA流 &#xff08;2&#xff09;开启DMA流的中断 二、软件设计 1、KEYLED 2、fsmc.h、fsmc.c、dma.h、dma.c 3、main.h…

二分查找算法——山脉数组的峰顶索引

一.题目描述 852. 山脉数组的峰顶索引 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 题目给了我们一个山脉数组&#xff0c;山脉数组的值分布就如下面的样子&#xff1a; 然后我们只需要返回数组的峰值元素的下标即可。 三.算法原理 1.暴力解法 因为题目明确说明…