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的储存形式:

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

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

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

相关文章

【嵌入式——QT】QWT应用

【嵌入式——QT】QWT应用 概述步骤一步骤二步骤三代码声明代码实现图示 概述 QWT&#xff0c;全称Qt Widgets for Technical Applications&#xff0c;是一个基于Qt开发的第三方库。它主要为具有技术背景的程序提供GUI组件和一组实用类&#xff0c;用于生成各种统计图。QWT的主…

科技助力高质量发展:新质生产力的崛起与企业数字化转型

引言 随着科技的飞速发展&#xff0c;我们正逐渐步入数字化智能时代&#xff0c;这个时代不仅为企业带来了无限的机遇&#xff0c;也让其面对前所未有的挑战。在这个快速变革的时代&#xff0c;企业必须不断调整自己的经营策略&#xff0c;适应数字化转型的浪潮&#xff0c;以…

时间减少90%以上!分布式系统的性能优化实战

1背景 分布式批量系统指的是采用分布式数据库架构&#xff0c;主体功能由批量程序实现的系统。分布式系统批量程序的性能测试&#xff0c;除了和联机交易性能测试一样关注服务器资源使用率是否合理、是否存在性能异常外&#xff0c;在测试执行阶段需要关注是否因数据分布不均衡…

初识二叉树

文章目录 一.什么是树二.什么是二叉树三.二叉树的访问次序四.特殊的二叉树五.求结点个数六.平衡二叉树总结 一.什么是树 树是由一个集合以及在该集合上定义的一种关系构成的。 集合中的元素称为树的节点&#xff0c;所定义的关系称为父子关系。 父子关系在树的节点之间建立了一…

RuoYi-Vue-Plus(基础知识点jackson、mybatisplus、redis)

一、JacksonConfig 全局序列化反序列化配置 1.1yml中配置 #时区 spring.jackson.time-zoneGMT8 #日期格式 spring.jackson.date-formatyyyy-MM-dd HH:mm:ss #默认转json的属性&#xff0c;这里设置为非空才转json spring.jackson.default-property-inclusionnon_null #设置属性…

JetPack之DataBinding基础使用

目录 一、简介二、使用2.1 使用环境2.2 xml文件绑定数据2.3 数据绑定的对象2.3.1 object2.3.2 ObseravbleField2.3.3 ObseravbleCollection 2.4 绑定数据 三、应用场景 一、简介 DataBinding是谷歌15年推出的library,DataBinding支持双向绑定&#xff0c;能大大减少绑定app逻辑…

python灾害应急救援平台flask-django-php-nodejs

灾害应急救援平台的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0c;…

【Selenium(五)】

一、鼠标事件 from selenium import webdriver # 导入ActionChains类进行鼠标悬停操作 from selenium.webdriver.common.action_chains import ActionChains import time# 打开一个浏览器 # 法一、添加环境变量重启电脑 # 法二、填写浏览器驱动的绝对路径 driver webdriver.E…

功率半导体IGBT模块封装工艺

功率器件最近非常火热&#xff0c;作为新型功率半导体器件的主流器件&#xff0c;IGBT应用非常广泛&#xff0c;如家用电器、电动汽车、铁路、充电基础设施、充电桩&#xff0c;光伏、风能&#xff0c;工业制造、电机驱动&#xff0c;以及储能等领域。IGBT模块是新一代的功率半…

undo log

从这篇「执行一条 SQL 查询语句&#xff0c;期间发生了什么&#xff1f; (opens new window)」中&#xff0c;我们知道了一条查询语句经历的过程&#xff0c;这属于「读」一条记录的过程&#xff0c;如下图&#xff1a; 那么&#xff0c;执行一条 update 语句&#xff0c;期间发…

桌面显示器PD芯片:引领桌面显示技术的新篇章

随着科技的飞速发展&#xff0c;桌面显示器作为人们日常工作与生活中不可或缺的重要设备&#xff0c;其性能与品质也在不断提升。其中&#xff0c;PD芯片作为桌面显示器中的核心组件&#xff0c;发挥着至关重要的作用。本文将对桌面显示器PD芯片进行详细介绍&#xff0c;探讨其…

MD5源码(C语言描述)

本文介绍MD5源码&#xff08;C语言描述&#xff09;。 MD5(Message-Digest Algorithm 5)&#xff0c;即消息摘要算法5&#xff0c;是一种被广泛使用的消息散列算法。散列算法的基础原理是&#xff1a;将数据&#xff08;如一段文字&#xff09;经过运算转换为一段固定长度&…

#Linux(VMwareTOOL安装)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09;打开虚拟机然后安装&#xff0c;出现灰色可能是已经安装过但是自己没有找到 &#xff08;3&#xff09;删除VM…

流畅切换Linux的应用程序

流畅切换Linux的应用程序 流畅切换Linux的应用程序一.Linux启动一个程序在后台执行1. 使用nohup和&&#xff1a;2. 使用ctrlZ&#xff1a;3.使用screen&#xff1a;3.1 创建会话3.2 要重新连接到此会话&#xff1a;3.3 中途退出会话&#xff0c;但程序继续运行:3.4 结束一个…

STM32的简单介绍

STM32是一种基于ARM Cortex-M内核的32位微控制器&#xff0c;由意法半导体公司开发和生产。STM32具有丰富的外设和功能&#xff0c;适用于各种应用场合&#xff0c;如工业控制、消费电子、物联网、人机交互等。STM32的优势包括低功耗、高性能、高可靠性、易于开发等。STM32的系…

上海晋名室外暂存柜助力新技术皮革制品生产行业安全

本周上海晋名又有一台室外危化品暂存柜项目通过验收&#xff0c;此次项目主要用于新技术皮革制品生产行业油桶、化学品等物资的室外暂存安全。 用户单位创立于2004年&#xff0c;是一家从事新技术皮革制品加工、生产的外资企业。 上海晋名作为一家专注工业安全防护领域&#…

基于消失点的相机自标定

基于消失点的相机自标定 附赠最强自动驾驶学习资料&#xff1a;直达链接 相机是通过透视投影变换来将3D场景转换为2D图像。在射影变换中&#xff0c;平行线相交于一点称之为消失点。本文详细介绍了两种利用消失点特性的标定方法。目的是为根据实际应用和初始条件选择合适的标…

SpingBoot集成Rabbitmq及Docker部署

文章目录 介绍RabbitMQ的特点Rabbitmq术语消息发布接收流程 Docker部署管理界面说明Overview: 这个页面显示了RabbitMQ服务器的一般信息&#xff0c;例如集群节点的名字、状态、运行时间等。Connections: 在这里&#xff0c;可以查看、管理和关闭当前所有的TCP连接。Channels: …

component-右侧抽屉组件

1.右侧抽屉组件 点击筛选&#xff0c;右侧抽屉滑出&#xff0c;点击取消或者点击空白处抽屉收起。 2.代码 <template><div class"all" click"hidden()"><!-- 抽屉 --><div class"drawer"><div class"drawerBo…

js处理数组分类

const obj [{"groupingType": "1","remark": "梨花带雨","totalRmbMoney": 7,"kyeGroupingType": "广州一组"},{"groupingType": "2","remark": "99","…