基于C语言的数据存储研究

目录

一,类型的基本几种:

二,原码,反码,补码

三,整型提升

四,大小端介绍(大学老师指定不爱讲的知识)

五,大小端知识的用处

六,关于unsigned一系列的深度学习


一,类型的基本几种:

整型大家庭:char,又分为 unsigned char,signed char

                     short 又分为unsigned short,signed short

                      int    又分为unsigned int,signed int

                     long 又分为unsigned long,signed long

浮点数家庭:

float

double

构造类型家庭:

数组类型

结构体类型 struct

枚举类型 enum

联合类型 union

指针类型家庭:

int* pi;

char* pc;

float* pf;

void* pv;

空类型家庭:

void表示空类型(无类型)

通常应用于函数的返回类型,函数的参数,指针类型。

二,原码,反码,补码

原码:将数值按照正负数的转换成二进制即可

反码:将原码的符号位不变,其他位依次按位取反即可

补码:反码+1就是原码

正数的原码,反码,补码,都是相同的

对于整型来说,数据存放的都是补码

三,整型提升

概念:c的整型算术运算总是至少以缺省整型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换就是整型提升。、、

方法:整型提升是按照变量的数据类型的符号位来提升的

举个例子:

负数的整型提升 ,,,char a = -1;

在存储时,只有一个字节,二进制位只有8个比特位,存储是以补码形式存储,1111 1111

所以整型提升的时候,高位补充符号位,即为1。

提升之后结果是4个字节,32个比特位

1111 1111 1111 1111 1111 1111 1111 1111

正数的整型提升,char b = 1

变量的二进制位有一个字节,也就是8个比特位,0000 0001

符号位是0,那就补0

0000 0000 0000 0000 0000 0000 0000 0001

就是这样,如果定义的是无符号数,在补码时整型提升,直接补0,因为没有符号位的概念。就补0就行

四,大小端介绍(大学老师指定不爱讲的知识)

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

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

存在的意义:

1,在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8个bit位。但是c语言里面,除了8bit的char之外,还有16bit的short型,32bit的long型。

2,此外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那必然存在一个如何将多字节安排的问题。因此就导致了1大端存储模式和小端存储模式

举个例子形象点吧:

一个16bit的short型的x,在内存中的地址为0x0010(右边是低地址,左边是高地址),x的值为0x1122,那么0x11为高字节,0x22为低字节。

在大端模式下:把0x11放在低地址中,就是0x0010中,而0x22放在高地址中,0x0011(比之前的往后挪了一个)。。。。小端模式恰好相反。

我们常用的x86结构是小端模式,而keil c51为大端模式(测控,自动化类专业应该熟悉,51单片机)。很多的ARM,DSP都为小端模式。

五,大小端知识的用处

讲了这么多,还是关心他的实用性,这才是最是真实的。。。

许多互联网公司,大厂也好,中厂也好,面试的时候,会有手撕代码的流程。其中他们就喜欢搞这些概念性的知识理解,用它们去出题。

依靠大学老师那种念PPT的教课,去面试,等于送人头。这种知识上课根本不谈,就只说一些期末考试的东西罢了。

百度这种厂子,在前几年就有一道笔试题,

简述大小端字节序的概念,并设计一个程序来判断当前机器的字节序。。

先搞主函数最简单,逻辑上表达清楚就行:

 难就难在对于调用函数的设计实现了

思路是:肯定得用到指针,地址这方面知识,并且还要区分高字节,和低字节。并能看到他们的存储位置。要不,定义一个整型,从里面截取一个,是不是可以了。对没错。如图即可

 1,先定义一个整型

2,强制类型转换,把int*类型,转换成char*

3,截取到了一个字节,这是在低地址上截取的一个字节

4,本来 00 00 00 01   取一个低地址后,是1  ,01是低字节

5,低字节,保存在低地址中,那就是小端了

 


六,关于unsigned一系列的深度学习

首先,打印signed整型是用%d来打印,而打印unsigned int  是用%u来打印。。。

只要不加unsigned 的类型,一律默认是有符号数,比如 +2 和2  都是一个意思,只有加-号,-2才是负数。。。。单独说2   就是正2

1,如题,

 解析:a和b不用过多接受,该是啥就是啥,他俩一个意思,上面解释过了。

c因为是定义的无符号字符,存放时,是以补码的形式存放,-1的补码是1111 1111,但是由于定义时是无符号数,没有符号位的概念,输出时,直接这个就是正数了,直接打印就行,输出十进制,转化十进制就是255。

2,如题:

 这题答案看似离谱,其实合理,得涉及到整型提升的知识点。查看目录三。128的存储时的二进制位是,(补码)1000 0000,,要打印的是,无符号整型%u,这可是4个字节,char不够啊,一个字节,怎么变成4个字节呢。。。整型提升,

1111 1111 1111 1111 1111 1111 1000 0000,这是补码的状态下,因为要打印十进制位,要把他转化为原码,因为是正数,所以还是1111 1111 1111 1111 1111 1111 1000 0000

十进制就是4294967168

再来一题狠的:

 按照正常思维,应该是1000,怎么也该循环一千次,数组里面应该放一千个数,长度是一千。

但是,忽略了一个重要的地方,这是定义的字符数组,char的范围是-128--127,一共是255个数,不能超出这个范围,

-1 ,-2 ,,,-128过后就是127,126 ,125,,,,1,0到0就结束了。

肯定有人问,再来一圈啊,还能循环几圈,理论上是这样的,但是这是char类型,并且有strlen的限制下,它到0 也就是’\0‘就结束咧,(’\0'的ascll码是0)

所以这题只能从-128到127再到0,往后没了,结束咧,正好是255.。。。。。

这题杀伤力很大,需要大伙,细品细品。。。

资源包含任务书以及说明书还有项目源码 设计要求: (1) 只能使用C语言,源程序要有适当的注释,使程序容易阅读 (2) 至少采用文本菜单界面(如果能采用图形菜单界面更好) (3) 写出课程设计报告,具体要求见相关说明文档 功能要求: 一车站每天有n个发车班次,每个班次都有一班次号(1、2、3…n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。如 班次 发车时间 起点站 终点站 行车时间 额定载量 已订票人数 1 8:00 太原 广汉 2 45 30 2 6:30 太原 成都 0.5 40 40 3 7:00 太原 成都 0.5 40 20 4 10:00 太原 成都 0.5 40 2 (1)录入班次信息(信息用文件保存),可不定时地增加班次数据 (2)浏览班次信息,显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。 (3)查询路线:可按班次号查询,,可按终点站查询 设计要求: (1) 只能使用C语言,源程序要有适当的注释,使程序容易阅读 (2) 至少采用文本菜单界面(如果能采用图形菜单界面更好) (3) 写出课程设计报告,具体要求见相关说明文档 功能要求: 一车站每天有n个发车班次,每个班次都有一班次号(1、2、3…n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。如 班次 发车时间 起点站 终点站 行车时间 额定载量 已订票人数 1 8:00 太原 广汉 2 45 30 2 6:30 太原 成都 0.5 40 40 3 7:00 太原 成都 0.5 40 20 4 10:00 太原 成都 0.5 40 2 (1)录入班次信息(信息用文件保存),可不定时地增加班次数据 (2)浏览班次信息,显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。 (3)查询路线:可按班次号查询,,可按终点站查询 (4)售票和退票功能 A:当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数 B:退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值