一、数据类型介绍
c语言中的基本的数据类型主要有这么几种
(1)char 字符数据类型
(2)short 短整型
(3)int 整型
(4)long 长整型
(5)long long 更长的整型
(6)float 单精度浮点数
(7)double 双精度浮点数
如果整型还要进行细分的话,又可以分为有符号(signed)整型和无符号(unsigned)整型。如果是有符号整型,那最高位是符号位,如果是无符号整型,那全部位都是有效位,举个例子吧:
signed char: 10001111 表示-15
unsigned char:10001111 表示143
首先我们先来看一下整型家族里面有哪些成员
(1)char unsigned char signed char
(因为字符在存储的时候,存储的是ASCII码值,ASCII码值是整型数据,所以char归类的时候放在整型家族)
(2)short unsigned short [int] signed short [int]
(3)int unsigned int signed int
(4)long unsigned long [int] signed long [int]
(5)long long unsigned long long [int] signed long long [int]
二、原码,反码和补码的转换
整型数据的二进制表示形式有3种:原码,反码和补码,在内存中整型数据是以补码的形式存储的。它们的转换方法如下图所示:
举个例子来说吧,我们都知道整型在内存中占4个字节,一个字节有8个二进制位,那一个数用二进制表示出来共有32位,因为正数的原码,反码和补码都一样,所以我们拿一个负数来举个例子:
比如这个数是-10,那么它用二进制来表示就是10000000 00000000 00000000 00001010,这里最高位是符号位,0表示正,1表示负。
原码:10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101
补码:11111111 11111111 11111111 11110110
如果是补码转原码,首先末位减一,然后除符号位其余按位取反。
三、大端字节序存储和小端字节序存储
如果宝子们想看看数据在内存中到底是怎么存放的,可以这么操作:
首先,第一步,打开VS,我们先定义一个整型变量a,然后给它一个值,这里我们为了方便观察,可以给它赋一个16进制的值。为啥呢,虽然这些数本质上在内存中存放的是二进制,但是在VS上为了方便展示,显示的是16进制。
然后,按F10开始调试,接着在调试 > 窗口 > 内存 >,随便点一个内存都可以
然后我们就可以看到这个界面了
但是这里我们看到a的值在内存里是倒着存放的,为啥呢,因为这里的存储方式是小端存储,大端存储和小端存储的区别如下图所示:
这里给宝子们解释一下:
1.字节序:是以字节为单位,讨论存储顺序的
2.小端字节序存储:把一个数据的低位字节的内容,存放在低地址处,把一个数据高位字节的内容,存放在高地址处。
大端字节序存储:把一个数据低位字节的内容,存放在高地址处,把一个数据高位字节的内容,存放在低地址处。
如果有老铁搞不清什么是低位字节或者高位字节的内容的话,可以拿十进制的数来理解,比如123,3是个位,2是十位,1是百位,那么1就是高位,3就是低位。我们上面给出的16进制的数也一样,0x11223344,11就是高位,44就是低位。这么解释应该可以理解吧。
那我们了解了大端和小端后,我们就知道为啥在这里数据是倒着放的了。
3.写一个程序来判断是大端存储还是小端存储
首先我们需要先定义一个整型变量a,然后把给a赋值1。
&a就可以拿到a的地址,为了方面观察,我们将它强制类型转换为char*,为啥要强制类型转换,因为整型一次性可以访问4个字节,而char一次性只可以访问一个字节,我们只需要看第一个字节即可。如下图所示:
代码如下: