C语言中数据是如何存储在内存中的

目录
  • 前言
  • ‍数据类型介绍
  • ‍整形数据在内存中存储
  • ‍浮点型数据在内存存储

前言

在计算机内存中,数据的存储方式都是以0和1的形式存储,也就是二进制的形式,数据是如何向内存写入的呢?整形数据以补码的形式存储,浮点型的存储规则较多,类似于科学计数法。

‍数据类型介绍

为什么需要有这些数据类型?

数据类型解决了数据存储的问题。

‍整形数据在内存中存储

整数中有三种二进制表示形式,分别是原码、反码、补码,正整数的原码 = 反码 = 补码,通常取最高位作为符号位。

原码:直接将正负整数按照二进制形式转换即可。

15原码:  (0) 1111 
-15原码: (1) 1111
23原码:  (0) 10111
-28原码: (1) 11100
注意:()表示符号位,1表示负,0表示正。

补码:负整数的补码将原码的符号位不变,其它位依次取反。

15反码:  (0) 1111 
-15反码: (1) 0000
23反码:  (0) 10111
-28反码: (1) 00011

反码:负整数的反码在补码的基础上+1

15补码:  (0) 1111 
-15补码: (1) 0001
23补码:  (0) 11000
-28补码: (1) 00100

对于整形数据来说:数据存放的实际是存放补码。

当我们定义变量时,系统会根据变量的数据类型,给变量开辟空间。这也是为什么要引入数据类型这个概念。

1.举例:5是如何存储到内存中

5是一个整形常量,在C语言中写一个整形常量,不超过int类型所能表示的范围,以32位表示整形常量。

5的原码码 = 补码 = 反码

5原码:00000000 00000000 00000000 00000101

5存入short类型的变量:取后16位

00000000 00000000 00000000 00000101

5存入int类型的变量:取32位

00000000 00000000 00000000 00000101

2.举例:-10是如何存储到内存中的

-10原码:10000000 00000000 00000000 00001010

-10反码:11111111 11111111 11111111 11110101

-10补码:11111111 11111111 11111111 11110110

-10存入short类型:取后16位

11111111 11111111 11111111 11110110

-10存入int类型变量:取32位

11111111 11111111 11111111 11110110

如何取出数据?

取出数据首先要知道数据的地址,得到地址后,如何确定取出范围,由变量的数据类型来决定。

int main()
{
	/*
	a的原码、反码、补码:00000000 10011000 10010110 1000000
	*/
	int a = 10000000;
	/*
	b是short*类型,解引用访问时,只有访问两个字节的权限
	*b拿出的数据是补码: 10010110 10000000->原码:11101001 10000000
	*/
	short* b = &a;
	printf("%d", *b);//-27008
	return 0;
}

为什么要使用补码的形式存储?

在计算机中CPU有中,只有加法器。以补码形式存储,符号位参与运算,既可以计算减法也可以计算加法。

大端存储模式:指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。

小端存储模式:指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。

大小端主要由处理器决定,与编译器,操作系统这些没有直接的关系。

‍浮点型数据在内存存储

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

  • (-1)S*M*2^E
  • (-1)S表示符号位,当S = 0,V为正数;S = -1,V为负数
  • M表示有效数值,大于等于1,小于2
  • 2^E表示指数位

类似于科学计数法:1090 = 1.090*10^3

IEEE754规定单精度浮点型和双精度浮点型存储模型

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

1<=M<2,M可以写成1.xxxxxx的形式,xxxxxx表示小数部分。

IEEE754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以舍去,只保存后面的xxxxxx部分。在读取时,再把第一位添上。节省一位有效数字.

对于指数E,情况比较多。

首先E为无符号整数,如果E为八位,取值范围时0~255,E为11位,取值范围为0~2047,但是再科学计数法中E可以出现负数,所以IEEE 754则规定,存入内存E的真实数必须加上一个中间数,对于八位的E,中间数为127,对于11位的E,中间数位1023。例如2^13的E是13,所以在保存E时,必须保存成13+127 = 140,即10001100。

指数E从内存中取出还可以分为3种情况

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

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

比如:

0.5的二进制位0.1,由于规定整数部分1<=M<2,即第一位必须位1,则将小数点右移一位,则为1.0*2^(-1),E的实际存储位-1+127,E的实际存储为01111110,M = 1.0,小数部分为0,M的存储为23位00000000000000000000000。

则0.5的二进制表示形式位:

0 01111110 00000000 00000000 0000000

2.E全为0

这时,浮点数的指数E等于1-127(或者1-1023),即为真实值

有效数字M不再加上第一位的1,而是还原位0.xxxxxx的小数,这样可以表示0,以及接近于0的很小数字。

3.E全为1

如果有效数字M全位0,表示无穷大。

举例:

10.0转化为二进制形式为1010.0,相当于:1.010*2^3,按照标准格式 可得S = 0,M = 1.010,E = 3。

举例1:7.25是如何存储到内存中的呢?

首先将7.25转化为二进制111.01

写成标准形式:1.1101*2^2

S = 0,M = 1101,E = 2+127

0 10000001 11010000 00000000 0000000

验证:

有误的地方还请批评指正。

到此这篇关于C语言中数据是如何存储在内存中的的文章就介绍到这了,更多相关C语言数据存储内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    目录 前言 浮点型在内存中的存储 浮点数存储的例子 浮点数存储规则 IEEE 754规定 IEEE 754对有效数字M的特别规定 IEEE 754对指数E的特别规定 存入内存是E的规定 从内存取出时E的规定 举例 1 举例 2 举例 3 判断两个浮点数是否相等? 总结 前言 本文接着学习数据的存储相关的内容,主要学习浮点型数在内存中的存储与取出. 浮点型在内存中的存储 常见的浮点数:3.14159.1E10 浮点数家族包括: float.double.long double 类型 浮点数表示的范

  • 关于C语言中数据在内存中的存储详解

    前言 1. 数据类型详细介绍 2. 整形在内存中的存储:原码.反码.补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中的存储解析 一.数据类型介绍 1.类型的基本归类 1.整形家族 char unsigned char signed char short unsigned short [int] signed short [int] int unsigned int signed int long unsigned long [int] signed long [int] 2.浮点型家族

  • C语言中数据在内存如何存储

    目录 数据类型 类型的基本归类 整形 浮点型 构造类型(自定义类型) 指针类型 空类型 整形在内存中的存储 大小端字节序 储存时数据发生截断以及整型提升 浮点型在内存中的存储 浮点型和整形在内存中的储存方式不同 拿出这些储存的数据(三种情乱) 情况一:E不全为0或不为全1 情况二:E全为0 情况三:E为全1 数据类型 常见的数据类型 常见的数据类型 字节 char 字符数据类型 1 short 短整型 2 int 整形 4 long 长整型 4 long long 更长的整形 8 float 浮

  • C语言数据在内存中的存储详解

    目录 文章摘要 一.C语言的数据类型 数据类型基本分为: 二.隐式类型转换 1.什么是隐式类型转换 2.整型提升 3.类型转换 三.机器大小端 1.什么是大小端 2.大小端在截断的应用 3.判断当前机器的字节序是大端还是小端 四.整型在内存中的存储 1.原码.反码.补码 2.举例实践整型数据在内存的存储 总结 文章摘要 本文通过内存底层原理,帮你透彻了解数据存储进内存与从内存中读取的区别以及不同数据类型下数据计算.赋值的变化情况 要透彻理解这些,必须知道隐式类型转换以及机器大小端的概念,本文会对

  • C语言编程数据在内存中的存储详解

    目录 变量在计算机中有三种表示方式,原码反码,补码 原码 反码 补码 总结一下 浮点数在内存的储存 C语言中,有几种基本内置类型. int unsigned int signed int char unsigned char signed char long unsigned long signed long float double 在内存中创建变量,会在内存中开辟空间,并为其赋值. int a=10; 在计算机中,所有数据都是以二进制的形式存储在内存中. 变量在计算机中有三种表示方式,原码反

  • C语言数据(整数、浮点数)在内存中的存储

    本篇主要讨论:整数.浮点数在内存中是怎么保存的! 数据类型详细介绍 在前面C语言基础概览中,已经提到过了基本的C语言内置类型,但C语言的数据类型有无数种~ 但是可以把这些类型分为几个大类: 类型的归类: 存整数的 char,short,int,long,long long及所配套的unsigned,int*,int[]- 2.存浮点数的 float,double,float[]- 结构体(结构体在内存中的存储后面在进行讨论~) 整数在内存种的存储: 1.字节序 2.补码 内存窗口 调试模式下的内

  • C语言中数据是如何存储在内存中的

    目录 前言 ‍数据类型介绍 ‍整形数据在内存中存储 ‍浮点型数据在内存存储 前言 在计算机内存中,数据的存储方式都是以0和1的形式存储,也就是二进制的形式,数据是如何向内存写入的呢?整形数据以补码的形式存储,浮点型的存储规则较多,类似于科学计数法. ‍数据类型介绍 为什么需要有这些数据类型? 数据类型解决了数据存储的问题. ‍整形数据在内存中存储 整数中有三种二进制表示形式,分别是原码.反码.补码,正整数的原码 = 反码 = 补码,通常取最高位作为符号位. 原码:直接将正负整数按照二进制形式转换

  • C++中整形与浮点型如何在内存中的存储详解

    目录 1 数据类型 1.1 类型的基本归类 2 整形在内存中的存储 2.1 二进制的三种形式 2.2 大小端字的介绍 3 浮点数在内存中的存储 3.1 浮点数存储规则 1 数据类型 前面我们已经知道了基本的内置类型: 类型的意义: 1. 使用这个类型开辟内存空间的大小(大小决定了使用范围). 2. 如何看待内存空间的视角. 1.1 类型的基本归类 整形家族: char unsigned char signed char short unsigned short [int] signed shor

  • C语言中数据如何存储进内存揭秘

    目录 内存简单介绍 整数与字符在内存中的存储 浮点数在内存中的存储 大小端存储模式及简介 总结 内存简单介绍 大家肯定经常听说内存这个词,内存到底是什么呢? 在计算机中,进程都要加载进内存中,也是我们各种数据的流通途径,C语言中,大家肯定都知道指针变量,指针变量中保存的就是内存的地址,那么,什么是内存的地址呢? 内存的单位是字节 对于32位的机器,有32根地址线,每根地址线在寻址时,产生的高低电压分别为0/1,那么32根地址线产生的地址就会是 00000000000000000000000000

  • C语言详细分析不同类型数据在内存中的存储

    目录 数据类型的介绍 类型的基本归类 整形在内存中的存储 大小端介绍 一道笔试题 浮点数在内存中的存储 浮点数存储规则 剖析题目 数据类型的介绍 在我们之前的学习当中我们已经介绍了基本的内置类型 char 字符数据类型 short 短整型 int 整形 long 长整型 long long 更长的整形 float 单精度浮点数 double 双精度浮点数 这些类型的意义是: 1.使用这个类型开辟内存空间的大小,大小决定了使用范围 2.如何看待内存空间的视角. 类型的基本归类 整形 整形中分为有符

  • C语言深入探索数据类型的存储

    目录 数据类型介绍 类型的基本归纳 整型家族 浮点数家族 构造类型 指针类型 空类型 整型在内存中的存储 原码,反码,补码 大小端 浮点数在内存中的存储 浮点数存储的规则 数据类型介绍 首先,对于我们C语言中的数据类型,大家应该都有一个清晰的认识吧!如果不记得也没有关系哦~ 在这里来跟着小刘同学回顾一下吧! 关于数据类型,我们在前面已经学习过了一些内置数据类型,以及它们所占的内存空间的大小,例如: char         //字符数据类型int          //整型short      

  • vuex中数据持久化插件vuex-persistedstate使用详解

    目录 数据持久化vuex-persistedstate使用 安装起步 配置使用 自定义存储方式 想使用cookie同理 使用vuex-persistedstate插件遇到的问题 数据持久化vuex-persistedstate使用 vuex是在中大型项目中必不可少的状态管理组件,刷新会重新更新状态,但是有时候我们并不希望如此.例如全局相关的,如登录状态.token.以及一些不常更新的状态等,我们更希望能够固化到本地,减少无用的接口访问,以及更佳的用户体验. 安装起步 npm i vuex-per

  • Python StringIO如何在内存中读写str

    这篇文章主要介绍了python StringIO如何在内存中读写str,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写.StringIO就是在内存中读写str from io import StringIO ff = StringIO('Hello!\nHi!\nGoodbye!') f = StringIO() #创建StringIO对象--可以看做在内存中的文件 i=f.w

随机推荐