C语言—数据在内存中的存储

1.整数在内存中的存储

文章回顾(C语言—操作符详解)

整数的2进制表示方式有三种,即原码、反码和补码。

有符号的整数,三种表示方式均有符号位数值位两部分,符号位都是用0表示“正”,用1表示“负”,最高位的一位是被当做符号位,剩余都是数值位。

正整数的原、反、补码都相同。

负整数的三种表示方法各不相同。

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。

反码:将原码的符号位不变,其他位次按位取反。

补码:反码+1。

对于整型来说:数据存放内存中,其实存放的是二进制的补码。

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

2.大小端字节序和字节序判断

#include <stdio.h>int main()
{int a = 0x11223344;return 0;
}

可以发现:在内存管理中,是倒着存储的。

2.1 大小端

其实超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储。

大端(存储)模式:数据的低位字节内容保存在内存的高地址处,而数据的高位字节内存,保存在内存的低地址处。

小端(存储)模式:数据的低位字节内存保存在内存的低地址处,而数据的高位字节内存,保存在内存的高地址处。

2.2 为什么有大小端

在计算机系统中,是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit位,但是在C语言中除了8 bit的char之外,还有16 bit的short型,32bit 的long型(要看具体编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

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

练习1:

#include <stdio.h>
#include <string.h>int main()
{//10000000 00000000 00000000 00000001//11111111 11111111 11111111 11111110//11111111 11111111 11111111 11111111char a = -1;//11111111——>整型提升11111111 11111111 11111111 11111111//                     10000000 00000000 00000000 00000000//                     10000000 00000000 00000000 00000001signed char b = -1;unsigned char c = -1;//11111111——>整型提升00000000 00000000 00000000 11111111printf("a=%d,b=%d,c=%d", a, b, c);//                      -1  -1 255return 0;
}

练习2:

#include <stdio.h>int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a));return 0;
}

输出:255

练习3:

#include <stdio.h>unsigned char i = 0;//  0-255int main()
{for (i = 0; i <= 255; i++){printf("hello world\n");}return 0;
}

死循环

3.浮点数在内存中的存储

常见的浮点数:3.14159、1E10等,浮点数家族包括:float、double、long double 类型。

浮点数表示的范围:float.h  中定义。

3.1 浮点数的存储

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:

  • V=(-1)的S次方  *  M  *  2的E次方
  • (-1)的S次方表示符号位,当S=0时,V为正数;当S=1,V为负数。
  • M表示有效数字,1<=M<2
  • 2的E次方表示指数位

10进制的5.5。在二进制中就是(-1)的0次方 * 1.011 * 2 的2次方。

对于32位的浮点数(float),最高的1位存储的是S,接着的8位存储指数E,剩下的23 存储M

对于64位的浮点数(double),最高的1位存储的是S,接着的11位存储指数E,剩下的52位存储M

3.1.1 浮点数存的过程

IEEE 754 对有效数字M和指数E,还有一些特别规定。

M的存储方式:

前面说过,1<=M<2,也就是说,M可以写成1.xxxxxxx的形式。

同时,IEEE 754 也规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被省去,

只保存后面的xxxxx(小数部分)。

E的存储方式:

关于指数E,首先E是一个无符号整数(unsigned int)。

这意味着,如果E是8位的,它的取值范围是0 - 255 ;如果E是11位的,它的取值范围是0 - 2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时,E的真实值必须再加上一个中间数。对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023,。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10 + 127 ,即10001001。

3.1.2 浮点数取的情况

情况1:E有0有1

这时,浮点数就采用下面的规则表示,即指数E的计算值减去127,得到真实值,再将有效数组M前加上第一位的1。

比如:0.5的二进制形式为0.1,由于规定了有效数字的范围,所以就变成了:(-1)^0 * 1.0 * 2^(-1)。

最后就是:0    01111110    00000000000000000000000

情况2:E全为0

说明指数真实值其实是1-127次方或者1-1023次方(这是一个死规定),而且前面那个整数1也不要了。那么这个数肯定就是一个很接近0的数字。

情况3:E全为1

说明指数真实值其实是128,说明这个数其实是一个很大很大的数字。

作者自述:本文主要针对数据在内存中的存储形式的知识。内容中包含了很多总结内容。本文制作不易,求求动动你们发财的小手点个赞和关注,这是对我创造最大的动力。后续我也会跟进内容,尽量一周至少一次,保证内容的质量。如果有想知道的内容或者有建议的地方,欢迎后台私信或者在本文留言哦。感谢各位的支持捏Thanks♪(・ω・)ノ。

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

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

相关文章

数据库 | 试卷四

1.数据库系统的特点是 数据共享、减少数据冗余、数据独立、避免了数据不一致和加强了数据保护 2.关系模型的数据结构是二维表结构 3.聚簇索引 cluster index 4. 这里B&#xff0c;C都是主属性&#xff0c;所以B->C不是非主属性对码的部分函数依赖 候选键&#xff08;AC&a…

复利(Compound Interest)是什么?中英双语介绍

中文版 复利&#xff08;Compound Interest&#xff09;深入介绍 1. 什么是复利&#xff1f; 复利&#xff08;Compound Interest&#xff09;&#xff0c;也称为“利滚利”&#xff0c;是指利息不仅会根据本金计算&#xff0c;还会根据已经累积的利息计算。这种方式可以让投…

极端天气频繁之下,新能源风力发电风机巡检建设智能化超高清化趋势明显

这个6月&#xff0c;中央气象台连发7天高温预警&#xff0c;全国多地气温超40度&#xff0c;全国出现40℃以上高温的范围持续增加&#xff0c;6个国家站日最高气温突破6月极值。极端热浪不仅冲向中国&#xff0c;几乎北半球的所有地区&#xff0c;也同样被这股热浪影响。 随着…

LabVIEW共享变量

共享变量简介 LabVIEW​为​创建​分布​式​应用使用​共享​变量​可以简化​此类​应用的编程。​ 借助​共享​变量&#xff0c;​您​可以​在​同​一个​程序​框​图​的​不同​循环​之间​或者网络上​的​不同VI之间​共享​数据。与LabVIEW中的许多​其他数据​共…

htb_Editorial

hack the book Editorial 端口扫描 80 22 目录扫描 /upload 是一个上传book information的页面 其中最顶上有一个可以上传书本封面的地方&#xff0c;可以从本地上传&#xff0c;也可以从远程下载 这里可能涉及ssrf和本地文件上传&#xff0c;逐一尝试 随便上传一个图片…

idea搜索只显示100条、如何修改idea搜索的条数

文章目录 一、老版本的IDEA&#xff08;2021年之前的版本&#xff09;二、新版本的IDEA&#xff08;2021年及之后的版本&#xff09;2.1、方式一2.2、方式二 如下图&#xff1a;idea搜索的时候默认只显示100条 要解决IDEA搜索只显示100条的问题&#xff0c;可以通过修改搜索结…

腾讯云入选Gartner®边缘分发平台代表厂商,为企业数字化升级保驾护航

刚刚获悉&#xff0c;国际信息技术研究和分析机构Gartner正式发布《Market Guide for Edge Distribution Platforms》报告&#xff0c;腾讯云凭借边缘安全加速平台EdgeOne成功入选代表厂商。相信这意味着腾讯云EdgeOne领先的技术、产品和实践能力得到了认可。 万物互联时代&am…

【UML用户指南】-19-对基本行为建模-用例图

目录 1、组成结构 2、表示法 3、一般用法 3.1、对主题的语境建模 3.2、对主题的需求建模 4、常用建模技术 4.1、对系统的语境建模 4.1.1、设计过程 4.2、对系统的需求建模 4.2.1、设计过程&#xff1a; 5、正向工程 UML 中的用例图是对系统的动态方面建模的 5 种图之…

进入docker容器内部操作mysql数据库

文章目录 1、查询docker容器2、进入mysql容器内部3、连接mysql数据库4、查询mysql所有的数据库5、使用某个数据库6、展示数据库中所有的表7、查询某张表8、断开mysql9、退出mysql容器 1、查询docker容器 [rootlocalhost ~]# docker ps CONTAINER ID IMAGE …

Java 序列化与反序列化

Java 序列化是一种将对象的状态转换为字节流的机制&#xff0c;以便可以将该对象的状态保存到文件、数据库或通过网络传输。在反序列化过程中&#xff0c;这些字节流可以被重新转换为对象。序列化主要用于以下几种情况&#xff1a; 持久化存储&#xff1a;将对象的状态保存到文…

商城小程序:颠覆传统电商,打造全新商业生态

在数字化浪潮的推动下&#xff0c;网购行业呈现多元化繁荣发展态势&#xff0c;出现了琳琅满目的商品应用小程序&#xff0c;但市面上的商城小程序基本属于通用型&#xff0c;无论是商城界面展示和基本功能&#xff0c;都不能满足个性化和商品推广需求&#xff0c;阻碍了商品的…

测试cudaStream队列的深度

测试cudaStream队列的深度 一.代码二.编译运行[得出队列深度为512] 以下代码片段用于测试cudaStream队列的深度 方法: 主线程一直发任务,启一个线程cudaEventQuery查询已完成的任务,二个计数器的值相减 一.代码 #include <iostream> #include <thread> #include …

linux下cuda安装-ubuntu22.04安装cuda11.8(cuda+cudnn)

原文链接&#xff1a;linux下cuda安装-ubuntu22.04安装cuda11.8(cudacudnn) 导言 cuda是nvidia提供在N卡上实现并行计算的工具包&#xff0c;cudnn是cuda的运行时库&#xff0c;通过cuda提供的内核函数能够高效的在N卡上跑密集计算程序。 本文在N卡机器上安装好了相应的驱动后…

Building wheels for collected packages: mmcv, mmcv-full 卡住

安装 anime-face-detector 的时候遇到一个问题&#xff1a;Installation takes forever #1386&#xff1a;在构建mmcv-full时卡住&#xff0c;这里分享下解决方法&#xff08;安装 mmcv 同理&#xff0c;将下面命令中的 mmcv-full 替换成 mmcv&#xff09; 具体表现如下&#x…

学习笔记——交通安全分析06

目录 前言 当天学习笔记整理 交通行为、心理与安全 结束语 前言 #随着上一轮SPSS学习完成之后&#xff0c;本人又开始了新教材《交通安全分析》的学习 #整理过程不易&#xff0c;喜欢UP就点个免费的关注趴 #本期内容接上一期05笔记 当天学习笔记整理 交通行为、心理与…

基于Java技术的家乡特色推荐系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;SpringBoot框架 工具&#xff1a;Eclipse&#xff0c;Navi…

强大的多数据库客户端工具:DataGrip【送源码】

今天给大家带来的工具是&#xff1a;DataGrip 介绍 DataGrip是jetbrains开发的一款关系数据库和 NoSQL 数据库的多数据库客户端工具&#xff0c;可以30天免费试用&#xff0c;后续使用需要购买。 DataGrip还是一款强大的跨平台工具&#xff0c;支持多种操作系统&#xff0c;比…

这个方法在Arcmap10.8里打得开adf文件

ArcMap如何打开.adf图层文件并将其文件转换为shp文件_adf文件怎么在arcmap里打开-CSDN博客像adf和它的info应该放在C盘&#xff0c;然后路径命名应该符合要求。 adf科普&#xff1a;ArcMap如何打开.adf图层文件并将其文件转换为shp文件_adf文件怎么在arcmap里打开-CSDN博客

鸿蒙开发组件:【DataAbility的生命周期】

DataAbility的生命周期 应用开发者可以根据业务场景实现data.js/data.ets中的生命周期相关接口。DataAbility生命周期接口说明见下表。 表1 DataAbility相关生命周期API功能介绍 接口名描述onInitialized?(info: AbilityInfo): void在Ability初始化调用&#xff0c;通过此回…

优化Java代码中的多层if...else结构

在软件开发中&#xff0c;尤其是处理各种逻辑判断时&#xff0c;多层嵌套的if...else语句几乎是无法避免的。然而&#xff0c;随着业务逻辑的复杂度增加&#xff0c;过度使用if...else会导致代码难以阅读、维护困难且容易出错。本文将探讨几种有效的方法来优化Java代码中的这类…