C语言数据在内存中的存储流程深入分析

目录
  • 前言
  • 类型的基本分类
    • 整型
    • 浮点数
    • 自定义类型
  • 整型在内存中的存储
    • 原码、反码、补码
    • 大端和小端
    • 如何判断编译器是大端还是小端
  • 浮点数在内存中的存储
  • 总结

前言

C语言中有char、short、int、long、long long、float和doubole这些数据类型。这些数据类型也叫内置类型。

所占存储空间的大小:

数据类型 所占存储空间的大小
char 1个字节
int 4个字节
short 4个字节
long 4个字节
long long 32位平台下占4个字节 ,64位平台下占8个字节
float 4个字节
double 8个字节

类型的基本分类

整型

整型一共有char、int、short、long和long long这五种类型。

char类型的数据在内存中存放的是ASCII码值,是整型,所以也被当成整型。

这些整型都分为有符号的整型和无符号的整型,具体可以看下面:

	int a = 5;
	signed int b;//有符号的整型
	unsigned int c;//无符号的整型

signed是有符号的,unsigned是无符号的。

平时我们定义变量时,一般都不会加前面,只是int 变量名 = 数据,其实这就相当于signed int 变量名 = 数据。

注意 \color{#FF0000}{注意} 注意 :但是char这个类型比较特殊,在C语言的标准中,没有定义char到底是有符号的还是无符号的,取决于编译器。

关于无符号和无符号:

前面我们说到了int类型在内存中占4个字节,1个字节就是8个bit。

比特位即bit,是计算机最小的存储单位。以0或1来表示比特位的值(二进制表示)。

10的二进制序列就如图所示,其中第一位是符号位,0代表正数,1代表负数

浮点数

浮点数有float和double,一般用来表示小数。

float的表示精度低,存储数值范围较小。

double的表示精度高,存储数值范围较大。

自定义类型

自定义类型有数组类型、结构体类型、枚举、联合体、指针类型和空类型(void)。在这就不一一详细讲了。

整型在内存中的存储

在了解整型在内存中的存储前,先了解一个计算机的原码、反码、补码。

原码、反码、补码

数值表示形式有:二进制、八进制、十进制和十六进制。

整数的二进制也有三种表达形式:原码、反码、补码。

整数中:

正数的原码反码补码相同

负数的原码反码补码是需要计算的

  • 原码:整数的二进制序列(注意符号位)
  • 反码:符号位不变,其它位按位取反就是反码(0变1,1变0)
  • 补码:反码加1就是补码

整型在内存中存放的是补码

接下来来验证内存中存放的是补码:

我定义了一个a变量,值为-10. 原码反码和补码也给大家了,因为正整数的原码、反码和补码相同,所以不用正整数验证。接下来让我们来用编译器来调试并监视来观察内存,来看看整型在内存中是如何存储的。

看上图,虽然这里面看到的是十六进制,但不要认为是以十六进制存储的,但本质存的还是二进制序列。由此我们可以得出内存中存放的是补码。

大端和小端

我们看到上图a的地址和我们写的十六进制序列是反着的,为什么?这就是大小端的问题了。

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

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

如何判断编译器是大端还是小端

int main()
{
	int a = 1;
	if(*(char*)&a == 1)
	{
		printf("小端")
	}
	else
	{
		printf("大端")
	}
}

如果是小端存储存储的顺序应该是01 00 00 00 大端的话是00 00 00 01

我们对a进行取地址,然后强转成char类型的指针然后再进行解引用,因为强制类型转换了,所以只能访问1个字节的地址,如果得到的1就是小端,0就是大端。

浮点数在内存中的存储

根据国际标准IEEE(电气和电子工程协会)754,一个浮点数 (Value) 的表示其实可以这样表示:

也就是浮点数的实际值,等于符号位(sign bit)乘以指数偏移值(exponent bias)再乘以分数值(fraction)。

简单来说就是对于浮点数在内存中的存储,无论是float(32位浮点数)还是double(64)位浮点数(S),都有符号位(Exp),指数位和有效数字位(Fraction)。

对于float这种32位浮点数来说,指数位占8个bite位,有效数字位占23个bite位

对于double这种64位浮点数来说,指数位占11个bite位,有效数字位占52个bite位

符号位都是占1个bite位。

其中因为浮点数的小数部分,用二进制中难以存储,就会存在精度不准的问题。

单精和双精浮点数的有效数字分别是有存储的23和52个位,加上最左手边没有存储的第1个位,即是24和53个位。

由以上的计算,单精和双精浮点数可以保证7位和15位十进制有效数字。

总结

对于数据在内存中的存储,大家还是要重点掌握原码、反码和补码的,要会计算,然后是浮点数的存储方式,可以把它当成一个拓展知识来了解,拓展一下眼界,如果真要熟练掌握浮点数的存储规则是要研究很多东西的,大家感兴趣也可以去看一下国际标准IEEE754。

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

(0)

相关推荐

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

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

  • C语言数据的存储专项分析

    目录 数据的类型介绍 类型的基本归类 整形在内存中的存储 源码.反码.补码 关于大小端的概念 浮点型在内存中的存储 数据的类型介绍 类型的基本归类 在写数据类型的介绍之前,我们首先来简单介绍下 release版本与debug版本之间的在内存上的区别: 我们先将下面的一段代码在VS中运行一下,得到的结果是截然不同的 int i = 0; int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i <= 12; i++) { arr[i] = 0; pri

  • C语言大小端字节序存储模式深入解读

    目录 前言 一.大小端介绍 1. 大端字节序与小端字节序的概念 2. 为什么会有大小端之分? 3.一道和字节序相关的例题 题干 思路 二.如何设计一个小程序判断当前机器的字节序 百度2015年系统工程师笔试题 题干 解题 前言 本文以C语言实现,主要通过例题+说明的模式讲解存储模式:大小端字节序. 对于正整数而言,它的补码 = 原码 = 反码: 对于负整数而言,它的补码 = 原码按位取反(就是反码) + 1: 例如,当语句int a = 500被执行时,内存中会开辟 4字节(即32bit)的空间

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

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

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

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

  • C语言深入分析整形数据存储

    目录 数据类型 类型的分类 整形在内存中的存储 原码.反码.补码 大小端介绍 char类型数据的取值范围 练习 练习1 练习 2 练习 3 练习 4 练习 5 练习 6 练习 7 数据类型 C语言中存在着数据类型,我们或多或少都见到过. char //字符数据类型 - 1个字节 short //短整型 - 2个字节 int //整形 - 4个字节 long //长整型 - 4/8个字节 long long //更长的整形 - 8个字节 float //单精度浮点数 - 4个字节 double /

  • C语言数据存储归类介绍

    目录 数据类型的介绍 类型的基本归类 整型在内存中的存储 什么是大小端 浮点数在内存中的存储 浮点数在内存中的存储规则 数据类型的介绍 在前面的章节中我们基本认识到了各种数据类型,这里我们就稍微回忆以下吧 类型的意义: 决定了访问内存空间的大小 决定了看待内存空间的视角(例如:整型和字符数据类型) 类型的基本归类 整型家族: char    unsigned char    signed charshort    unsigned short [int]    signed short [int

  • 深入分析C语言存储类型与用户空间内部分布

    目录 1.定义变量的格式 2.6个存储类型 3.auto存储类型-自动存储类型 4.register存储类型-寄存器存储类型 5.const存储类型-常量存储类型 6.static-静态存储类型 7.extern-修饰全局变量 8.volatile-易变存储类型 9.用户空间内部分布图 1.定义变量的格式 存储类型 数据类型 变量名 = 初始值; 2.6个存储类型 自动存储区:auto register 非自动存储区:const static extern volatile 3.auto存储类型

  • C语言数据在内存中的存储流程深入分析

    目录 前言 类型的基本分类 整型 浮点数 自定义类型 整型在内存中的存储 原码.反码.补码 大端和小端 如何判断编译器是大端还是小端 浮点数在内存中的存储 总结 前言 C语言中有char.short.int.long.long long.float和doubole这些数据类型.这些数据类型也叫内置类型. 所占存储空间的大小: 数据类型 所占存储空间的大小 char 1个字节 int 4个字节 short 4个字节 long 4个字节 long long 32位平台下占4个字节 ,64位平台下占8

  • 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++浅析数据在内存中如何存储

    目录 一.数据类型 二.原码反码补码 三.大小端 整型提升 一.数据类型 数据类型有7种: char            字符型     short          短整型    int               整型   long            长整型   long long    更长整型   float            单精度浮点数    double        双精度浮点数 二.原码反码补码 计算机中的整数有三种2进制表示方法,即原码.反码和补码. 三种表示方法均

  • 关于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语言数据(整数、浮点数)在内存中的存储

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

  • C语言详解float类型在内存中的存储方式

    目录 1.例子 2.浮点数存储规则 1.例子 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); re

  • C/C++的浮点数在内存中的存储方式分析及实例

    C/C++的浮点数在内存中的存储方式分析 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中,存放方式为  10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式.但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法. 在二进制科学表示法中,S=M*2^N 主要由三部分构成

  • 深入C/C++浮点数在内存中的存储方式详解

    任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中,存放方式为  10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式.但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法.在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M).对于flo

随机推荐