C语言进阶数据类型详解

   最近我学了C语言进阶版数据类型。关于这一节可以分成整型家族,浮点型家族,boll型,指针类型,构造类型,等等,接下来再了解一下把。

一.类型

1.整型家族

这里为啥说char也属于整型家族呢?这是因为字符本质上是ASCLL码,所以字符其实属于整型家族。

在这里还要提的一点是int, short, float, double ,都是分 有符号和 无符号类型的 ,当然char也分这两种,但是后者和前者是有区别的,前者有符号与否可由我们指定,即 (signed) int / short / float / long等等 表示有符号,unsigned int  / short / float / long等等 表示无符号。

对于有符号来说既可放正值也可以放负值,但是对无符号来说可以放正值也可以放负值(没想到吧),但是放负值会转化成相应正值(注意!!不是简单的去负号,而是根据原反补码转化)

打印无符号整型用的是%u,老铁们不要用错了啊!

2.浮点型家族

这一家人结构挺简单,就只有两个人,单精度哥哥与双精度弟弟,没啥好说的,知道就差不多了。 

3.构造类型

这一类型也叫做自定义类型,因为它是可以自定义的(废话文学)。

数组类型之所以属于自定义类型是因为数组元素个数也属于数组类型一部分。

其余的类型就不再赘述了,我们来看看整型在内存中的存储吧。

二. 整型在内存中的存储

谈到这个问题,我们就不得不谈一下原反补码了。

1.原,反,补码

原码是指按照一个数的正负值直接写出来的二进制序列。

在32位二进制序列中最高位是符号位,表示正负。

如1的原码是00000000000000000000000000000001

如-1的原码是10000000000000000000000000000001

反码是指在原码的基础上除符号位外其余位全部按位取反得到的二进制序列。

补码是指在反码的基础上减1得到的二进制序列。

对于正数来说原反补码相同,所以正数只需要知道其原码就行,复数才需要进行三种码之间的转换

下面我们以-5为例展示如何转换

 

内存中存储的是整型的补码。!!!!

有一个很好玩的事,就是

从原码到补码和从补码到原码的途径是完全相同的,不信你看下面这张图。 

那么这里我们迎来了一个无法避免的问题,我们为啥要把好好的一个数字拆成原反补码呢? 

2.为什么要有补码?

这个解释有点抽象,我们拿一个具体一点的例子来解释

例如 -1 + 1

倘若我们直接拿原码计算,则结果是这样的

 这个结果显然不对,那我们再看看用补码计算:

这样算答案就对了,所以说必须得有补码呀,至于科学家是怎么想到的,我只能说:天才呀!

3.大小端字序存储 

这里咱创建了一个变量a,那自然得为它分配空间,在内存窗口中以十六进制展现,但是奇怪的是为啥a的二进制序列它倒过来了?这就涉及到我们这个大小端的知识了

 因为啊咱的数据它大小超过了一个字节啊,它就得有一定的顺序,比如说0x11223344,你放内存里面就有好多种可能性嘛。比如说11 22 33 44,或者44 33 22 11,或者44 11 22 33等等,但是你把顺序打的太乱就挺反人类了,你让人家怎么记嘛。所以一般我们采取第一种或第二种存放方式,这两种方式也有他们独特的叫法——大小端字节序存储

大端存储是指低字节数据存放在高地址,高字节数据放在低地址,小端存储则是指低字节数据放在低地址,高字节数据放在高地址。如图所示

 了解了基本概念后我们来看一道百度面试题

 这题的话我们可以初始化变量为1,然后去判断先存放的是1还是0,是1则为小端存储,反之为大端存储。代码如下

当然我们也可以分装成一个函数来写

 

 今天就先到这吧,好困啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值