【C语言进阶】 数据在内存中的存储(1)——整形

目录

 

1、数据类型介绍

        1.1、类型的基本归类

                整形家族

                浮点数家族

                指针类型

                空类型

                构造类型

2、整形在内存中的存储

         2.1、原码、反码、补码

         2.2、大小端介绍

         2.3、有符号与无符号 

         2.4、练习

        例一

        例二

        例三

        例四

        例五 


 

1、数据类型介绍

我们先来简单了解一下我们前面所学的基本的内置类型

数据类型数据名占内存字节数表示范围
char字符数据类型1-128~127
short短整型2-32,768~32,767
int整形4-2,147,483,648~2,147,483,647(-231 ~ 231-1)
long长整型4或者8-2,147,483,648~2,147,483,647(-231 ~ 231-1)
long long更长的整形8-9223372036854775808~9223372036854775807
float单精度浮点数4-3.4x10-38 ~ 3.4x1038
double双精度浮点数8-1.7x10-308 ~ 1.7x10308

这么多类型存在的意义在于使用者可以选择自己所需要合适的类型

 

        1.1、类型的基本归类

根据这些数据类型,我们给他们做一个简单的分类

                整形家族

char

unsigned  char

signed  char

short

unsigned  short

signed  short

int

unsigned  int

signed  int

long

unsigned  long

signed  int

这里char为什么放在整形家族里呢?是因为字符在存储的时候,存储的是ASCII码值,是整型,所以放在整型家族里,蓝色为无符号,紫色为有符号后续会讲到,这儿保留悬念

                浮点数家族

                                            float
                                           double

                指针类型

   关于指针有疑问的小伙伴可以去看看博主对指针的讲解

char*  pc
int*   pi
float*  float
void*  pv

                  空类型

void表示空类型(无类型)
通常用于函数的参数、函数的返回类型、指针类型

                构造类型

数组类型
结构体类型
枚举类型
联合类型

2、整形在内存中的存储

 一个变量的创建是需要在内存中开辟空间的,而空间的大小是根据不同的类型来决定的。数据在这些空间中以二进制补码的形式存储,而计算机中有符号数有原码,反码,补码三种表示形式,并且还有符号位和数值位,符号位用0表示正数,1表示负数

         2.1、原码、反码、补码

我们这里用的是整型,而一个整形有4个字节=32bit位,所以二进制表示应为32位,第一位为符号位,1表示负数,0表示正数,中间用0补齐就好,正整数的原码、反码、补码表示如下

int a = 15;
//00000000000000000000000000001111 - 原码
//00000000000000000000000000001111 - 反码
//00000000000000000000000000001111 - 补码

 负整数的原码、反码、补码是需要计算的,计算方法和原码、反码、补码表示如下

int b = -15;
//10000000000000000000000000001111 - 原码
//11111111111111111111111111110000 - 反码(原码的符号位不变,其他位按位取反得到的就是反码)
//11111111111111111111111111110001 - 补码(反码+1就是补码)

  我们还需要明确的是整数在内存中存储的是补码,计算的时候也是使用补码计算的

         2.2、大小端介绍

在介绍大小端是我们先来看几组现象,有助于我们理解,博主这里使用的编译器为vs2019

f420b5b84b7444d1bb5fc986b61f27f3.png 但我们查看num的地址我们发现,数据在上面倒着存储,这是正数,我们再来看一下负数 

e0bda5d7865a4dd2a717e4adf90ae52d.png

我们发现还是倒着存储的,这是为什么呢?

这是因为大端和小端这两种存储模式

      大端:是数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。低地址-->>高数据   例如:手机

      小端:是指数据的地位保存在内存的低地址中,数据的高位则保存在内存的高地址中。低地址-->>低数据    例如:电脑
a8d26cf942614bc28c5d8d38dd6bfec3.png

这里呢我们想一下,除了通过调试,我们还有没有其他办法来判断大小端呢?

 

这里我们发现,当a=1时,大小端低位存储的值并不相同,所以我们写出以下代码

//int main()
//{
//	int a = 1;
//	char* p = (char*)&a;
//	if (*p == 1)
//		printf("小端\n");
//	else
//		printf("大端\n");
//	return 0;
//}

那么这个代码又是如实现的呢? 这里我们需要明确一个知识点,其实这个博主在指针是也有所讲到,这里就在浅提一下吧

ef1c93e92b014bee9755af52181df354.png

那么也就是所如果是访问的第一个字节是1那么就是小端,如果不是就是大端,如此一来就可以判断了

为什么会有大小端模式之分呢?

   这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

大小端存在的意义

1)在通信协议中,大小端模式是非常重要的。

2)在实际中,有些CPU用的是大端,有些则是小端,如不加以区别的话,可能会出现读取时和储存时字节顺序不一致的情况,从而造成数据的错误。

3)网络通信中一般为大端模式,常用计算机CPU为小端模式。


         2.3、有符号与无符号 

     这里注意有符号和无符号只针对整形

5b0c057e519e4213b359664b7f91aee7.png

在博主vs编译器上类型前面没有加unsigned都默认为有符号

我们知道数据在存储时是以二进制存储的,而二进制位的第一位为符号位,我们来看一个简单的演示再理解一下有符号和无符号

5876946ebea34afd862dd313194c875a.png

那么有符号与无符号对于我们的表示范围有没有区别呢?答案是显然的,有区别的

比如我们先来看一下有符号的吧

e63f18e4997a4afe856023028c8e0b24.png

再来看一下无符号的,没有符号位,全是数值位

ed2e383431544081a6b8039b4ee2095c.png

这里呢我们再拓展一下,当二进制位不断加一时,我们会发现到了极限时,又会回到最初位,这里我们借用大牛的图来理解一下

有符号的 

2ef79d2e18604937b9c298d1b63daef6.png

无符号的

2c6a3024ed8e469aaa0f57f48856bdbf.png

         2.4、练习

例一

1d3354ed5e3846718a651de32e4d9804.png

下面是代码解释和最终结果 

//#include <stdio.h>
//int main()
//{
//	char a = -1;
//	//10000000000000000000000000000001  原码
//	//11111111111111111111111111111110  反码
//	//11111111111111111111111111111111-截断,因为char只占一个字节
//	//11111111 -a
//	//11111111111111111111111111111111  整形提升
//	//11111111111111111111111111111110  反码
//	//10000000000000000000000000000001--> -1
//
//	signed char b = -1;
//	//11111111111111111111111111111111  反码
//	//11111111 -b
//	//11111111111111111111111111111111  整形提升
//	//11111111111111111111111111111110  反码
//	//10000000000000000000000000000001--> -1
//	unsigned char c = -1;
//	//11111111 -c   //无符号,前面补0
//	//00000000000000000000000011111111--.255
//	//
//	printf("a=%d,b=%d,c=%d", a, b, c);
//	//%d - 十进制的形式打印有符号整型整数
//	//整型提升
//
//	return 0;
//}

关于整形提升不懂的宝子,可以看博主在操作符(2)里的讲解 

 例二

754aee7bd5b0402ba8a5b10dbac31166.png

5ff264536de449e48e908479fba63ba6.png

 代码解释与运行结果如下

//#include <stdio.h>
//int main()
//{
//	char a = -128;
//	//-128
//	//10000000000000000000000010000000
//	//11111111111111111111111101111111
//	//11111111111111111111111110000000
//	//-128的补码
//	//10000000 有符号,补首位
//	//11111111111111111111111110000000
//	//由于我们打印的是无符号,所以上面就为我们要的原码
//	printf("%u\n", a);
//  %u打印无符号的十进制数
//	return 0;
//}

例三

d7ecedccadd2445bac23e7617a58a68a.png

解释如下

//int main()
//{
//	int i = -20;
//	//10000000000000000000000000010100
//	//11111111111111111111111111101011
//	//11111111111111111111111111101100
//	//
//	unsigned int j = 10;
//	//00000000000000000000000000001010 -->10
//	//11111111111111111111111111101100 -->-20
//	//11111111111111111111111111110110
//	//11111111111111111111111111110101
//	//10000000000000000000000000001010 -10
//	//
//	//11111111111111111111111111110110
//	//10000000000000000000000000001001
//	//10000000000000000000000000001010
//	printf("%d\n", i + j);
//	return 0;
//}

 例四

206859c65e42440da4e7b07f14ded083.png

 这里呢由于我们 i 是unsigned int,所 i 是恒大于0的,所以这个函数为死循环

例五 

//unsigned char i = 0;//0~255
//
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}

这里同理,无符号char取值范围为0~255,所以此题也是一个死循环

关于浮点数,博主会在下一篇进行介绍。

制作不易,记得一件三连哦!!!

 

  

 

 

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习段,你可以利用这些源码资源行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇事问春风乄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值