C语言基础知识:数据在内存中的存储解析(整数,浮点数)

简介: C语言基础知识:数据在内存中的存储解析(整数,浮点数)

和黛玉学编程..............>


整数在内存的存储

 之前就说过,数字二进制有3种保存方法,原码,反码,补码;而电脑存储整数的时候使用补码,这是因为cpu中只有加法器

 三种表示方法都有符号位和数字位,也就是signed 和unsigned ,有符号位就是正负区别啦

1.正数的原码,反码,补码都相同的

2.负数原码:按照二进制表示的

         反码:符号位不变,其他按位取反

        补码:反码基础上加一

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

 

大小端

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

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

小端存储模式:和上面相反

为什么要有这个大小端呢?

 在计算机系统中,我们是以字节为单位的,每个地址单元对应着一个字节,一个字节有8个比特位,但是在C语言中有8比特的char,还有16比特的short以及32比特的Long类型(一些编译器), 对于16或者32位的处理器,必然存在一个如何将多个字节安排的问题

 

浮点数在内存中的存储

举例:5.0,二进制是101.0,相当于1.01x2^2,S=0;M=1.01;E=2

        5.5,二进制是101.1,因为0.5是1x2^-1,表示的话就是(-1)^0 *1.011*2^2

但是总有些数字可能需要100位1000位才能表示出来,所以有些数字存储的时候与实际的有 误差

浮点数存的过程

M:前面说过,M是1到2之间的,所以M可以写成1.xxxxxx,其中xxxxx表示小数部分,所以在计算机内部保存的时候,默认第一位总是1 ,因此可以被舍去,只保存后面的部分,这样子可以节省一位有效数字,存储的范围也就大了。

E:

如果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=137,即10001001

在内存中分为三种情况

1.E不全为0或者不全为1:

           指数E的计算值减去127(或者1023),得到真实值,再将有效数字M前加上第一                位的1

2.E全为0;

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

3.E全为1:

         如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s

 

 

相关代码你们可以自己试试呀

#include <stdio.h>
int main()
{
int n = 9;
float *pFloat = (float *)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
*pFloat = 9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
return 0;
}

就到这里啦,如果对你有帮助,看希望可以收到你的小赞,你的赞将给创作者的我带来好多天的开心喲。

 


相关文章
|
5月前
|
存储 人工智能 NoSQL
Tablestore深度解析:面向AI场景的结构化数据存储最佳实践
《Tablestore深度解析:面向AI场景的结构化数据存储最佳实践》由阿里云专家团队分享,涵盖Tablestore十年发展历程、AI时代多模态数据存储需求、VCU模式优化、向量检索发布及客户最佳实践等内容。Tablestore支持大规模在线数据存储,提供高性价比、高性能和高可用性,特别针对AI场景进行优化,满足结构化与非结构化数据的统一存储和高效检索需求。通过多元化索引和Serverless弹性VCU模式,助力企业实现低成本、灵活扩展的数据管理方案。
271 12
|
5月前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
175 7
|
6月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
467 14
|
6月前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
2145 6
|
6月前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
340 5
|
6月前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
128 5
|
6月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
存储 C语言
C语言中的数据输入输出
C语言中的数据输入输出
157 0
|
缓存 C语言
C语言——数据的输入输出
C语言——数据的输入输出
|
C语言
C语言 字符数据输入输出
C语言 字符数据输入输出
177 0
C语言 字符数据输入输出

热门文章

最新文章

推荐镜像

更多
  • DNS