【c语言进阶】深入挖掘数据在内存中的存储

这篇具有很好参考价值的文章主要介绍了【c语言进阶】深入挖掘数据在内存中的存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


铁汁们,今天给大家分享一篇数组及详解冒泡排序,来吧,开造⛳️

数据类型介绍

类型的意义: 类型是用来创建变量, 变量的创建需要在内存中开辟一块内存空间 ,用来存储变量的值,类型的大小决定了开辟内存空间的大小

数据类型基本分类及其大小

基本内置类型:
【c语言进阶】深入挖掘数据在内存中的存储

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	printf("%d\n", sizeof(int));              //结果为 4
	printf("%d\n", sizeof(short));           //结果为 2
	printf("%d\n", sizeof(char));            //结果为 1
	printf("%d\n", sizeof(long));           //结果为 4
	printf("%d\n", sizeof(long long));     //结果为 8
	printf("%d\n", sizeof(float));        //结果为 4
	printf("%d\n", sizeof(double));      //结果为 8
	return 0;
}

c语言标准只规定sizeof(long)只要大于等于sizeof(int)即可。

【c语言进阶】深入挖掘数据在内存中的存储
构造类型:
【c语言进阶】深入挖掘数据在内存中的存储
指针类型:char* p、int* a、float* b等。

空类型:void,用于函数的返回值,函数参数、指针类型。

注意:void* p,空指针既不能进行解引用操作,也不能进行加减整数操作,若想要操作p所指向的值,则需要根据题意,进行强制类型转换。

整形在内存中的存储方式

原码、反码、补码

整形值在计算机内存中有三种不同表示形式:原码、反码、补码。三种表示形式均有一位符号位、其余为均为数值位。

符号位:0表示正数、1表示负数;数值位:原、反、补码均相同。

负整数二进制三种表示方式:

原码:

将数值根据正负数的形式直接翻译成二进制序列就得到原码。

反码:

将原码符号位不变,其他位依次按位取反(二进制数位取反,将0变成1,1变成0)就得到反码。

补码:

反码加一就得到补码。

注意:正整数的原码、反码、补码均相同。
例子:
【c语言进阶】深入挖掘数据在内存中的存储

注意:用于计算或存放在内存中全为补码,涉及该值打印时为原码(需要把计算的值补码->反码->原码)。

在计算机系统中,数值全部用补码来计算和存储,原因是补码,可以将符号位和数值位统一处理,而cpu中只有加法器,需要将减法转化为加法进行处理。

补码与原码相互转化,其运算过程是相同的:
【c语言进阶】深入挖掘数据在内存中的存储

大小端介绍

前提:以字节为单位,讨论存储顺序。

大端字节序存储

是指数据的低位存放在内存中高地址处,数据的高位放在内存中低地址处。

小端字节序存储

是指数据的低位存放在内存中低地址处,数据的高位放在内存中高地址处。
【c语言进阶】深入挖掘数据在内存中的存储

大小端字节序由来:
在计算机内存中,我们是以字节为单位的,每个内存单元大小为一个字节,一个字节对应着8个bit位,但在c语言中除了有8bit的char型,还有16bit位short型,还有32bit位int型,具体为多少要看具体的编译器,不同编译器所规定类型的大小不尽相同,对于位数大于8位的处理器,寄存器宽度大于1个字节,必然存在如何将多字节数排序列的问题,从而引起了大小端的诞生。对于char类型数据无大小端存储模式

判断一个系统是大端还是小端

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 1;
	char* p = (char*)&a;
	printf("%d\n", *p);
	return 0;
}

【c语言进阶】深入挖掘数据在内存中的存储
【c语言进阶】深入挖掘数据在内存中的存储

此处博主是用vs2019进行测试的,说明vs编译器是采用小端字节序存储方式进行存储数据。
【c语言进阶】深入挖掘数据在内存中的存储

char与unsigned char值范围与图解

char为字节,一个单位,8个bit位,有signed char、unsigned char这两种类型。

char、signed char范围:-128~127
【c语言进阶】深入挖掘数据在内存中的存储
unsiged char范围:0~255
【c语言进阶】深入挖掘数据在内存中的存储

整形存储相关练习题

扩展知识补充:整形提升

发生整形提升的条件:字节数小于int型,也就是char、short类型在参与计算时会发生整形提升,因为计算机计算时默认为Int型,4个字节,参与运算。

注意一个数发生整形提升时:
a.首先看其自己的类型,若为char、short型,为有符号位,整形提升时看最高位.
b.其次看在打印时,看是以什么格式进行打印,%d是打印有符号位十进制整数(将该数看成有符号数,补码转化为原码在进行打印),%u是打印无符号十进制整数(将该数看成整数,直接转化为十进制进行打印)。

题一、

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);
	return 0;
}

【c语言进阶】深入挖掘数据在内存中的存储
图解分析:

【c语言进阶】深入挖掘数据在内存中的存储
题二、

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char a = -128;
	printf("%u\n", a);
	return 0;
}

【c语言进阶】深入挖掘数据在内存中的存储
图解分析:
【c语言进阶】深入挖掘数据在内存中的存储
题三、

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char a = 128;
	printf("%u\n", a);
	return 0;
}

【c语言进阶】深入挖掘数据在内存中的存储
图解分析:
【c语言进阶】深入挖掘数据在内存中的存储
题四、

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = -20;
	unsigned int j= 10;
	printf("%d\n", i + j);
}

【c语言进阶】深入挖掘数据在内存中的存储
图解分析:
【c语言进阶】深入挖掘数据在内存中的存储
题五、

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<Windows.h>
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
		Sleep(1000);
	}
	return 0;
}

【c语言进阶】深入挖掘数据在内存中的存储
题解分析:因为i的类型为unsigned int型,i为正数,i的值>=0,for循环中的条件判断恒为真。

浮点数在内存中的存储方式

扩展知识:若想要观察整形家族在内存中的值的范围,整数表示的范围,是在#include<limits.h>中定义,浮点数值的范围是在#include<float.h>中定义。

【c语言进阶】深入挖掘数据在内存中的存储
【c语言进阶】深入挖掘数据在内存中的存储

浮点数存储规则

根据国际标准IEEE(电气和电子工程协会)754规定,任意一个二进制浮点数科学计数法变现形式为:
【c语言进阶】深入挖掘数据在内存中的存储
IEEE 754规定:

对于32位的浮点数float型(单精度浮点数),最高1位为符号位S, 接着其后8位为指数E, 剩下的23位为有效数字位M。
对于64位的浮点数double型(双精度浮点数),最高1位为符号位S, 接着其后11位为指数E, 剩下的52位为有效数字位M。

如图所示:
【c语言进阶】深入挖掘数据在内存中的存储
将浮点数存入内存中,IEEE 754对有效数字M和指数E的规定:

对于M:

由于1<=M<2,M可以写成1.XXXXX形式,其中XXXXX表示小数部分,在计算机内部保存M时,因默认这个数的第一位总是1,因此可以被舍去,只保留XXXXX小数部分。

对于E:

E为一个无符号整数,E为8位时,取值范围为0到255,E为11位时,取值范围为0到2047
但在科学计数法中的E是可以为负数的,所以,IEEE754规定,存入内存时E的真实值必须加上个中间数,对于8位的E,这个中间数为127,对于11位的E,这个中间数为1023(若某个数加上中间数大于E的取值范围,则会越界,但由于IEEE 754的规定,一般不会出现某个数加上中间数大于E的取值范围)。

例子图解:
【c语言进阶】深入挖掘数据在内存中的存储

将浮点数从内存中取出,IEEE 754对有效数字M和指数E的规定:

对于M:

把第一位的省略的1直接加上去,其后加个小数点,在其后加上存入内存中M部分,在特殊情况下M的取出与E也有关。

对于E:分类讨论

a.E不全为0或不全为1:将存入内存中的E减去127或者1023,就可得到真实值;

b.E全为0:浮点数E等于1-127或者1-1023,即为真实值,此时,有效数字M不在加上第一位的1,而是还原成
0.XXXXX的小数,
这样做的目的是为了表示是0,以及接近1于0的很小数字。(127-127=E->1.XXx*2^-127约等于0)。

c.E全为1(255=127+128,1.01->*2^128趋向正无穷),此处博主不在展开叙述。

案列

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;
}

【c语言进阶】深入挖掘数据在内存中的存储
解析:

a.以整数的形式放进内存中,在以整数的形式拿出来,结果才会为整形、以浮点数的形式放进内存中,在以浮点数的形式拿出来,结果才会为浮点数。

b.因为小数与整数在内存中的存储方式不同:

以整数的形式放在内存中,将其转化为二进制数,在以浮点数的形式打印,则将该二进制数当作浮点数的二进制数表示形式,在按照浮点数从内存中取出的规则来进行计算。

以浮点数的形式放在内存中,将其转化为浮点数二进制数,在以整数的形式打印,则将该二进制数直接当作整数的二进制数表示形式,按照补码->反码->原码,进行原码的打印。

【c语言进阶】深入挖掘数据在内存中的存储

结语

铁铁们,深入挖掘数据在内存中存储就到此结束啦,若博主有不好的地方,请指正,欢迎铁铁们留言,请动动你们的手给作者点个👍鼓励吧,你们的鼓励就是我的动力✨文章来源地址https://www.toymoban.com/news/detail-481624.html

到了这里,关于【c语言进阶】深入挖掘数据在内存中的存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c语言进阶部分详解(数据在内存中的存储)

    大家好,今天要进行梳理的内容是数据在内存中的存储相关内容。 在C语言中,数据在内存中的存储是一个非常重要的概念。了解数据在内存中的存储方式可以帮助我们更好地理解程序的执行过程,优化内存使用,提高程序的性能。 目录 一.数据类型介绍 1.类型的基本归类 

    2024年02月13日
    浏览(40)
  • 深入理解C语言(1):数据在内存中的存储

    文章主题:数据在内存中的存储🌏 所属专栏: 深入理解C语言 📔 作者简介:更新有关深入理解C语言知识的博主一枚,记录分享自己对C语言的深入解读。😆 个人主页: [₽]的个人主页 🏄🌊 char(字符型) char unsigned char signed char short(短整型) short [int] unsigned short [int]

    2024年02月08日
    浏览(37)
  • C语言进阶——数据在内存中的存储,你知道吗?

    之前我们涉及关于这一部分的知识只是大致的进行讲解,今天我们要把这个内容详细的讲解和总结。 在前面我们已经学习了基本的内置类型(内置类型就是语言自身定义的类型): char                //字符数据类型 short               //短整型 int                   //整形

    2024年02月02日
    浏览(38)
  • C进阶:数据在内存中的存储(2)

    在上一篇博文中,相信大家对于数据类型以及整数在内存中的存储有了一定了解,那么,浮点数是怎么在内存中存储的呢?下面来看一下我的讲解。 浮点数家族: 包括:float,double,long double类型。与limits.h相似, 浮点数也有限制范围的头文件float.h. 与limits.h相似,float.h也包括

    2024年02月11日
    浏览(40)
  • C进阶:数据在内存中的存储(1)

    大家好,感谢大家最近的支持,今天也是开始了C进阶一系列的博文的创作,欢迎大佬们来指点,欢迎来一起沟通!!! 我们都知道:C语言具有以下几种数据类型: 这里注意的是: sizeof(int) = sizeof(long), 在上述类型中,我们可以通过limits.h中的(MAX和MIN)获得类型的的最大值

    2024年02月06日
    浏览(37)
  • 【C进阶】深度剖析数据在内存中的存储

    目录 一、数据类型的介绍 1.类型的意义: 2.类型的基本分类 二、整形在内存中的存储 1.原码 反码 补码 2.大小端介绍 3.练习 三、浮点型在内存中的存储 1.一个例子   2.浮点数存储规则 前面我们已经学习了基本的内置类型以及他们所占存储空间的大小: char          //字符

    2024年02月10日
    浏览(38)
  • 数据在内存中的存储:深入了解与理解技巧

    ​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ ​ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 ​ 所属专栏:C语言学习 ​ 贝蒂的主页:Betty‘s blog ​ 我们早就学完基本的数据类型,那这些数据类型到底在内存中怎么存储的呢~,今天贝蒂就带大家一起深入学习一下吧 1.1 整型 贝蒂说:“因

    2024年01月24日
    浏览(42)
  • 深入挖掘C语言 ----动态内存分配

    开篇备忘录: \\\"自给自足的光, 永远都不会暗\\\" 正文开始 C语言提供了一个动态开辟内存的函数; 这个函数向内存申请一块连续可用的空间, 并返回指向这块空间的指针. 如果内存开辟成功, 则返回一个指向开辟好空间的指针 如果开辟失败, 则返回一个NULL指针, 因此malloc的返回值一

    2024年04月28日
    浏览(46)
  • c语言-数据在内存中的存储

    1.整数的2进制表示方法有三种,即 原码、反码和补码 2. 三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位最高位的一位是被当做符号位,剩余的都是数值位。 3. 存储时存储的是补码,取出的时取出的原码 如: 正负数的原码、反

    2024年02月04日
    浏览(43)
  • C语言:数据在内存中的存储

    在讲解操作符的时候,我们就讲过了下⾯的内容: 整数的2进制表示方法有三种,即 原码、反码和补码 三种表示方法均有 符号位 和 数值位 两部分,符号位都是用0表示“正”,用1表示“负”,而数值位最高位的⼀位是被当做符号位,剩余的都是数值位。 正整数的原、反、

    2024年04月10日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包