进入内存,透彻理解数据类型存在的意义,整形在内存中存储,大小端字节序,浮点型在内存中存储
创始人
2024-05-10 21:45:08
0
🌱博主简介:是瑶瑶子啦,一名大一计科生,目前在努力学习C进阶、数据结构、算法、JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛!
📜所属专栏:C语言
✈往期博文回顾:【Java基础篇】Java重要特性,JDK,JRE,JVM区别和联系,环境变量
🕵️‍♂️近期目标:成为百粉小博主。持续输出JavaSE、C进阶、数据结构、算法相关的优质博客,
🙇‍♀️写博客理念:力求用自己的语言加上自己的理解去阐述知识知识、技术(费曼学习法)。喜欢画图、思维导图去描述过程和知识之间的联系。
🎊工具:思维导图:Xmind;关系图,流程图:diagrams.net
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
🌺:“再牛的程序员也是从小白开始,既然开始了,就全身心投入去学习技术”

数据类型存在的意义

  • 我们知道,变量的创建是要在内存中申请空间的,那你用编程语言和计算机沟通的时候,你就要告诉计算机你要申请多大的空间,那么就需要在变量名前放一个数据类型,告诉计算机:我要给这个变量开辟这个类型所对应的这么大内存空间.简而言之,数据类型决定了变量所占空间的大小.

  • 确定了变量空间还不够,因为我们知道,对数据进行操作,首先我们也要知道它是浮点型?字符型?数组?因为不同的属性有不同的操作,计算机进行操作,更应该有这方面的知晓权.所以,数据类型决定了计算机看待该片内存中数据的视角.(认为是浮点型呀,还是字符型?)

C语言整形家族:

  • char---字符类型在内存中以其Ascii码表对应数值存储

  • signed char

  • unsigned char

char :默认具体是signed还是unsigned具体看编译器,常见是signed

  • short

  • signed short [int](默认)

  • unsigned short [int]

  • int

  • signed int(默认)

  • unsigned int

  • long

  • signed long [int](默认)

  • unsigned long [int]

🎉下面是Linux的64位操作系统下给出的,在不同操作系统下可能有所不同,在使用的时候应该测试之后再使用:使用sizeof(类型名)测试

类型

类型关键字

字节数

(二进制)位数

表示范围

字符型

(signed) char

1

8(1*8)

-128~127

无符号字符型

unsigned char

1

8

0~255

短整形

(signed) short (int)

2

16

-32768~32767(-2^15~2^15-1)

无符号短整形

unsigned short (int)

4

16

0~65535(0~2^16-1)

整形

(signed) int

4

32

-2147483648~2147483647(-2^31~2^31-1)

无符号整形

unsigned int

4

32

0~4294967295(0~2^32-1)

长整型

(signed) long (int)

8

64

2^63~2^63-1

无符号长整形

unsigned long (int)

8

64

0~2^64-1

C语言浮点型家族

类型名称

类型关键字

字节数

位数

有效数字

单精度浮点数

float

4

32

7位有效数字

双精度浮点数

double

8

64

15~16位有效数字

C语言中构造类型(自定义类型)

  1. 数组

  1. 结构体--struct

  1. 枚举--enum

  1. 联合--union

整形在内存中的存储:

计算机中的整数有3种表示方式(用二进制):原码(true form),反码,补码.
✨原码:就是十进制直接转换成二进制所得到的二进制序列
每一种表达方式,都有:符号位,数值位之分

符号位(最高位)

正数

0

负数

1

  • 正数的源码,反码,补码均相同!!!

  • 负整数的三种表达方式都不相同(需要经过相应的转换)

原码,补码,反码,为什么存在?

我们可能会想,为什么要设计出来3个东东,像我们自己平时10进制计算,都是直接进行的呀,没有说这么复杂.为什么不直接都用原码来表示呢?
  • 十进制和二进制有很大不同,10进制有专门的一个符号来表示正负,而且我们要站在机器的思路去思考.因为机器语言只认识:0和1

  • 而且,CPU只有加法器哦,比如1-1会被转换为1+(-1)

🎉假如整数在内存中也用原码来表示?

1: 00000000 00000000 00000000 00000001//原码
-1:10000000 00000000 00000000 00000001//负数原码
//相加:10000000 00000000 00000000 00000010//-2 ???

由此可知,用原码,是不可能算出正确结果的

🎃原反补存在意义:

  • 使正数和负整数能够正确进行运算,并得到正确结果

  • 统一处理符号位和数值位:在计算的时候不用特别去对待符号位

  • 统一处理加法\减法

而且,原->反->补和补->反->原所执行的流程是一样的,不需要额外的硬件电路.

char a = -1;
unsigned char b = -1;
printf("%d %d", a, b);
//       -1  255

执行过程分析:(一定要注意的点)

  1. 截断赋值

  1. 整形提升

  1. 操作补码(内存中对整数的操作:无论是赋值\加减\截断,都是对补码进行操作)

  1. 原码显示(简单理解为,从内存中取出数据,来打印数据,看看值是多少的时候,取出的原码哦)

  • 注意:内存中对数据的一些操作,都是在补码上进行的.要show这个数据((比如以%d形式打印)是多少的时候,才用到原码.

  • 补充:C语言格式控制字符使用说明:(用格式字符来打印的时候,不同的格式字符,体现了取出数据来展示的时候,看待补码的不同视角)

字符

含义

%d

十进制有符号整数(signed int)

%o

八进制无符号整数

%x

十六进制无符号整数

%u

十进制无符号整数(unsigned int)

%c

单个字符

%s

字符串

%e

指数形式浮点数

%f

小数形式单精度浮点数

%g

取e和f中较短的一种格式

%%

百分号本身

%lf

小数形式双精度浮点数

对取值范围的进一步思考:

设计得真的很神奇,数据的类型,限定死了范围,范围是个"闭环",或者是"周期函数".无论如何都出不了这个范围(长度规定和截断的功劳🐣)

  • 通过一道题来真实感受一下:

这段代码的输出结果是???

说实话我一开始认为是:3,2,1,0

运行之后才发现,太天真了,太天真了!!!

#include
int main() {unsigned int i = 0;for (i = 3; i >= 0; i--) {printf("%d", i);}return 0;
}

要注意的是:i被范围限定死了,无符号(0~2^32-1),也就是说,无论怎么对i进行操作,i>=0是恒成立的呀!!所以是个死循环!
再者需要注意的是,%d决定了取出数据时看待内存的视角("我就认为你是signed int")

大,小端字节序存储

  • 注意,这里的存储顺序,是以字节为单位!!!(即8bits)

大小端字节序介绍:

  • 大端字节序存储:高数值位的数据存在低地址处,低数值位的数据存在低地址出(按顺序)

  • 小端字节序存储:低数值位的数据存在高地址处,高数值位的数据存在低地址处(按顺序)

可以看到vs2019是采用小端存储的

为什么会存在大,小端字节序存储?

一个超过一个字节的要在内存中存储,如何安排这几个字节在内存中存储的顺序?安排好顺序后应该考虑如何尽可能方便的将数据取出病还原数据.通过排序可知,将不同的字节数据安排位置在内存中存储可谓有无数中方法.为了尽可能简便的存储数据,更是为了尽可能方便的取出数据,最终就这保留了两种字节顺序存储的方法.

笔试题:写一端程序来判断当前机器是大端存储还是小端存储

//写一个程序来判断当前机器是大端存储还是小端存储int a = 1;//0x00 00 00 01char* p = (char*)(&a);if ((*p) == 1) {printf("小端");}else {printf("大端");}return 0;

🛸key;利用了指针的类型决定了指向空间的大小

浮点数在内存中的存储

🎀这一小节,我们要解决的问题是:

  1. 浮点数在内存中如何存储

  1. 浮点数存储和取出的流程

  1. 为什么之前总是提到浮点数的精度,浮点数表示不准确?

浮点数在内存中如何存储

根据IEEE(电气电子工程师学会)规定,在内存中,任何一个二进制的浮点数,可以表示为一下形式:


:表示浮点数的正负
:有效数字(1<=M<2)(1+小数点后的位数=有效数字位数)
:指数位

🌌思考:通过例子我们可以知道,只要S,M,E三个变量确定了,那么这个浮点数也就确定了,所以我们只需要把S,M,E在内存中存储起来即可.

  • 能用图形解释清楚就不用文字了~

浮点数取出和存储的流程:

深入思考:为什么浮点数的储存不准确?

我们知道,十进制浮点数转换为二进制浮点数,小数点后的十进制表示也要转换成二进制表示形式.

eg:5.5
101.1
eg:5.14
101.00101...........
可以看到,关键是:无法用二进制准确表达出小数点后的数字,此时只能无限接近,不精确.
🎉这就是数据在内存中储存的全部内容了,码文,作图不易,如果对你有帮助,您的关注❤点赞👍收藏⭐评论🌻是对我最大激励!

相关内容

热门资讯

婚礼男方家长致辞 婚礼男方家长致辞通用15篇  无论在学习、工作或是生活中,大家都不可避免地会接触到致辞吧,致辞具有“...
学校班级元旦晚会主持稿 学校班级元旦晚会主持稿  导语:在学校召开元旦晚会的时候,通常要用到主持词的。接下来小编整理了学校班...
新郎迎娶新娘主持词 新郎迎娶新娘是一生中最浪漫的事情之一,那么都有什么好的主持词呢?以下是PINCAI小编整理的关于主持...
公司员工大会主持稿 公司员工大会主持稿  在现在的社会生活中,需要使用主持稿的情况越来越多,主持稿一般是由主持人根据场景...
开业的致辞 开业的致辞15篇  在日常的学习、工作、生活中,大家都对致辞很是熟悉吧,致辞是指在举行会议或某种仪式...
毕业聚餐主持词 毕业聚餐主持词  主持词是主持人在节目进行过程中用于串联节目的串联词。在当今中国社会,主持人在活动中...
女娲传说之灵珠经典台词 女娲传说之灵珠经典台词15句  你们根本不懂爱,你们的爱太过自私,不择手段。——仙乐  你放心,我不...
青春演讲比赛主持词 青春演讲比赛主持词  主持:  男——李勇  女——张雨  女:我与祖国共奋进男:我为崛起献青春。 ...
年会赞助商致辞 年会赞助商致辞(精选5篇)  在日常的学习、工作、生活中,要用到致辞的情况还是蛮多的,致辞具有很强的...
培训会主持词 培训会主持词(精选10篇)  在日常中,大家总免不了要培训及会议吧,那么你知道主持词怎么写吗?下面是...
电影《三少爷的剑》经典台词 电影《三少爷的剑》经典台词精选  1. 冷风如刀,大地荒漠,苍天无情。  2. 这世上永远有两种人,...
《十六个夏天》的经典台词 《十六个夏天》的经典台词大全  1.就说我不是他的收藏品,乱说什么啊!  2.说话冲的人,心里都是软...
80岁生日宴会致辞 80岁生日宴会致辞(精选11篇)  在学习、工作或生活中,大家都不可避免地会接触到致辞吧,致辞具有有...
婚宴长辈证婚人致辞 婚宴长辈证婚人致辞  在平日的学习、工作和生活里,大家总少不了要接触或使用致辞吧,致辞受场合、事件的...
元旦舞会主持词 元旦舞会主持词(精选7篇)  主持词要尽量增加文化内涵、寓教于乐,不断提高观众的文化知识和素养。在人...
圣诞联欢会主持词 圣诞联欢会主持词  活动对象的不同,主持词的写作风格也会大不一样。时代不断在进步,主持成为很多活动不...
美好童年—庆“六一”大型活动... 美好童年—庆“六一”大型活动主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。随着...
毕业晚会主持词串词 毕业晚会主持词串词  毕业,是人生的一个转折点,愿你们能展开双翼,飞得更高、看得更远。下面是小编给大...
运动会致辞 运动会致辞(精选5篇)  无论在学习、工作或是生活中,大家或多或少都用到过致辞吧,致辞要求风格的雅、...
六一儿童节的主持稿 六一儿童节的主持稿(精选8篇)  随着社会一步步向前发展,我们都不可避免地要接触到主持稿,主持稿是主...