c/c++整数和浮点数在内存中存储

了解变量的储存原理是我们灵活运用和防止数据截断改变带来的危害的有效途径。

那么我们从int  char和float double两类来阐述内存的储存。

首先我们讲内存单位

内存单位从小到大分别是bit  byte KB MB GB TB PB

bit是最小的内存单位,它可以存储一个二进制,可以表示两种情况0/1。

byte是字节,1byte=8bit 。计算机的内存可以以字节作为一个一个的整体,每一个字节都有一个地址(这里以64为进行举例)

KB就是1024个字节 ,MB就是1024个KB,1MB就是1024个GB,后面也是如此。

(我们在写程序的时候,一般更多关注的是比特字节。)

值得注意的是,任何数据在内存种都是以补码的形式存储的。

然后我们讲int char这两种类型  

学会后,long,short也是水到渠成的事情。

我们先以内存较小的char来看:

char占一个字节,这个字节所对应的地址就是char的地址。char在一般的编译器里是表示signed char,我们要表示无符号的char要用unsigned char。

char是如何储存数据的?

我们将1个字节展开,就有8个字节来存储。

那么就可以存储2^8个数据,也就是256个数据。

char原本是储存二进制的,是通过ascll码来转换字符的。我们如果用%d来打印,就能打印十进制的ascll码值。

我们分别从正数和负数来讨论:

正数:

从00000000到011111111(127)因为都是正数,所以在计算机源码就是补码。也就是这样储存的。

负数:

而10000001并不是表示-1,表示的是补码,我们还要取反加1或者减取反。随便用一种方法,我们先-1得到100000000然后除符号位取反得到11111111,最终表示的是-127。

如果我们再将10000001减1呢?

得到100000000这个似乎不好求源码,其实这个由计算机规定了,表示-128。

那么我们用一个环来表示有符号char的数据存储:(顺时针补码++)

对于无符号的就是水到渠成的事情:

int是四个字节,四个字节是连续的内存的,它的全名是叫signed int 表示有符号的整形。

我们在对一个int类型的变量进行取地址的时候,拿到的是最低的那个地址

例如上图,int这个int 的地址就是 0x0000000000000001,那么我们如何再次拿到这四个字节呢?当然就是指针类型来决定的。对应的指针类型可以访问对应字节数的内存

int如何储存数据的呢?储存范围是什么?

我们将四个字节展开,就有32个bit。每个bit可以表示两种情况,根据二进制数我们可以知道int可以存储2^32个数据。

那么int是有符号的,符号正负是两种情况,因此int 有一个bit来存储符号,31个bit存储数据。

它和char的储存方式是一样的,这里我就不再啰嗦,大家自己类比。

float和double的数据存储

浮点数因为有小数点,所以用之前的方法存储就不太现实。

那么就出现了另一种方法:

我们以float来进行讲解,然后double储存是类似的。

 首先我们数学中有种数据的表示方法:科学计数法。而我们存储float,double也是差不多的。

-1000.86我们可以写成 (-1)^1  *  1.00086  *  10^3;

10.24我们可以写成 (-1)^0     *    1.024   *10^1;

那么我们把十进制改成二进制:

5.5我们写成二进制:101.1->  (-1)^0  *   1.011  *  2^2

那么我们推广到任意形式:  (-1)^S  *  M  *   2^ E

我们只要存储S M E  就行了。

 其中E的取值范围是1<=E<2这样保证了E全是1.什么,那么我们就可以将1省掉,只保存小数点后面的数据,这样就可以增加我们的精度。

为什么说叫增加精度呢?因为我们的float和double都是无法都精确保存数据的。我们小数点后一位数是1/2,后第2位数1/4,后第三位数1/3,这导致一些数是无法精确保存或者要很长的二进制数组来保存。

下面是double的储存形式:

因为浮点数和字符形整型数不同。我们在整形数、字符之间强制类型转换还有可能保证打印的数据不出错,但是我们如果拿给浮点数就彻底出错了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker容器下部署hbase并在springboot中通过jdbc连接

我在windows的docker中部署了一个hbase服务&#xff0c;然后用springboot连接到此服务并访问数据。 详情可参考项目中的README.md。项目中提供了用于构建镜像的dockerfile&#xff0c;以及测试代码。 项目连接&#xff1a;https://gitee.com/forgot940629/hbase_phoenix_spring…

Java学习路线大纲

一、学习路线 二、学习大纲 0. 地基部分 数据结构&#xff1a;线性表、队列、栈、树、图、哈希等等常见算法&#xff1a;10大排序、字符串匹配、二分法、双指针等等操作系统&#xff1a;进行线程管理、内存管理、I/O等等计算机网络&#xff1a;四层协议、TCP/UDP、HTTP/HTTPS等…

安装elasticsearch和kibana

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&#xff0c;这个镜像体积非常大&#xff0…

互联网思维:息共享、开放性、创新和快速反应、网络化、平台化、数据驱动和用户体验 人工智能思维:模拟人、解放劳动力、人工智能解决方案和服务

互联网思维&#xff1a;信息共享、开放性、创新和快速反应、网络化、平台化、数据驱动和用户体验 互联网思维是指一种以互联网为基础的思考方式&#xff0c;强调信息共享、开放性、创新和快速反应的特点。这种思维方式注重网络化、平台化、数据驱动和用户体验&#xff0c;以适…

数通-路由策略

路由策略 访问控制&#xff1a;1.acl控制——通过控制流量&#xff0c;起到控制作用。2.路由控制 注意&#xff1a;ACL在做报文过滤时&#xff0c;默认允许所有&#xff1b;在做路由抓取时&#xff0c;默认拒绝所有&#xff0c;且只能使用基本ACL。 路由控制 1、路由策略&a…

基于springboot的反诈宣传平台

技术&#xff1a;springbootmysqlvue 一、系统背景 反欺诈平台可以对公交信息进行集中管理&#xff0c;可以真正避免传统管理的缺陷。反欺诈平台是一款运用软件开发技术设计实现的应用系统&#xff0c;在信息处理上可以达到快速的目的&#xff0c;不管是针对数据添加&#xff…

电力柜智能蓝牙锁控解决方案

一、行业背景 随着智能电网的快速发展&#xff0c;电力柜作为电网的重要组成部分&#xff0c;其安全性和可靠性对于保障电力供应至关重要。传统的电力柜锁控系统多依赖于物理钥匙&#xff0c;存在管理不便、安全隐患大、难以实时监控等问题&#xff0c;为了提高电力柜的安全管…

AI绘画自动生成器:让艺术创作触手可及

随着人工智能技术的飞速发展&#xff0c;越来越多的应用领域逐渐与AI技术融合。在艺术领域&#xff0c;AI绘画自动生成器成为了一款备受关注的产品。它利用深度学习算法&#xff0c;让用户通过输入关键词或描述性文本&#xff0c;就能在几秒钟内生成一幅独特的艺术作品。在这篇…

探索人工智能基础:从概念到应用【文末送书-42】

文章目录 人工智能概念人工智能基础【文末送书-42】 人工智能概念 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;作为当今科技领域的热门话题&#xff0c;已经深刻地影响着我们的生活和工作。但是&#xff0c;要理解人工智能&#xff0c;我们首先需…

杂记8---多线激光雷达与相机外参标定

背景&#xff1a;本人开源的标定程序&#xff0c;提供大家参考学习 基于棋盘格的多线激光雷达和鱼眼/针孔模型相机外参标定的程序 前言 标定数据&#xff0c;只需要一个棋盘格标定板。把标定板放置lidar 与camera 共视区域&#xff0c;拜拍几个pose进行采集。 基于简谐原则…

快速傅氏变换(Fast Fourier Transform,FFT)算法基本原理详细解析

目录 目录 FFT 基本原理 FFT算法 Cooley-Tukey 步骤概述&#xff1a; 1、分解&#xff1a;将原始序列分成偶数部分和奇数部分。原始DFT问题就被分解成两个长度为N/2的子问题&#xff0c;分别对应偶数索引和奇数索引的元素。 2、递归&#xff1a;递归地对这两个子序列应用F…

多线程libtorch推理问题

一、环境 我出问题的测试环境如下: pytorch1.10+cu113 pytorch1.10+cu116 pytorch2.2+cu118 libtorch1.10.1+cu113 libtorch1.10.1+cu111 libtorch1.9.0+cu111 二、问题现象 最近封装libtorch的推理为多线程推理的时候,遇到一个现象如下: (1)只要是将模型初始化放到一个…

黑马现有java课程框架及其功能梳理

目录 高并发相关提高通信效率Netty作用&#xff1a;哪些框架使用它&#xff1a; ChannelChannelHandler 和 ChannelPipelineEventLoop 和 EventLoopGroup**涉及的名词解释&#xff1a;**NIOSocketNginx 高并发相关 主要用来解决IO密集型程序&#xff08;大量文件读写&#xff…

游戏软件报错xinput1_3.dll丢失如何修复,5种方法一分钟教你修复完成

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示或者程序无法正常运行的情况。其中&#xff0c;一个常见的问题就是与xinput13.dll文件相关的问题。那么&#xff0c;xinput13.dll到底是什么呢&#xff1f;本文将对其进行详细介绍&#xff0c;帮助大家更好地理解和解…

25.7 MySQL 数据库和表的基本操作

1. 基础知识 1.1 一条数据的存储过程 存储数据确实是处理数据的基石, 只有确保数据被准确无误且有条理地存储, 我们才能对其进行深入的处理和细致的分析. 否则, 这些数据就像是一团毫无章法的乱麻, 让我们难以捉摸其内在的逻辑和价值.那么, 如何才能够将用户那些与经营紧密相关…

60、服务攻防——中间件安全CVE复现weblogicJenkinsGlassFish

文章目录 weblogicJbossJenkinsGlassFish weblogic 默认端口&#xff1a;7001&#xff0c;历史漏洞&#xff1a;CVE_2017_3506、CVE_2018_2893、CVE_2018_3245、CVE_2020_14882、CVE_2021_2394 Jboss 历史漏洞&#xff1a;CVE-2017-12149、CVE-2017-7504 Jenkins GlassFis…

Java面试相关问题

一.MySql篇 1优化相关问题 1.1.MySql中如何定位慢查询&#xff1f; 慢查询的概念&#xff1a;在MySQL中&#xff0c;慢查询是指执行时间超过一定阈值的SQL语句。这个阈值是由long_query_time参数设定的&#xff0c;它的默认值是10秒1。也就是说&#xff0c;如果一条SQL语句的执…

【免费】教你如何考取华为人才在线《人工智能技术与应用V2.0》认证

人工智能技术与应用V2.0考试PC网址 课程详情 (huawei.com) 注&#xff1a;免费认证&#xff0c;里面包含免费的课程&#xff0c;浏览器用Edge。 文章目录 人工智能技术与应用V2.0考试网址 前言 一、备考流程 二、联系内容 三、注意事项 总结 前言 随着人工智能&#xff…

一键成片解决方案,轻松解决企业内容创作难题

当今视频内容已经成为企业推广和品牌建设不可或缺的重要元素。然而&#xff0c;传统的视频制作流程繁琐、耗时&#xff0c;往往让企业望而却步。美摄科技凭借前沿的人工智能技术&#xff0c;推出了一键成片解决方案&#xff0c;为企业用户带来前所未有的高效、智能的视频创作体…

AI+ 发展展望

引言 随着人工智能技术的不断进步&#xff0c;"AI"已经成为一个热门话题&#xff0c;它代表着人工智能与其他行业的深度融合。"AI"不仅仅是技术的进步&#xff0c;更是一场影响深远的社会变革。在这篇文章中&#xff0c;回望历史我们将探索历史经验&#…