栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于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 也就是’‘就结束咧,(’'的ascll码是0)

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934766.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号