一、基本数据类型:
1. 整型
概念:
表达整数类型的数据
语法:
int a = 123; // 定义了一个专门用来存储整数的变量a
需要注意的地方:
-
- int 的本意是 integer,即整数的意思
- int a 代表在内存中开辟一块小区域,称为 a,用来存放整数,a 一般被称为变量。
- 变量 a 所占内存大小,在不同的系统中是不一样的,64位系统典型的大小是4个字节。
- 变量 a 有固定的大小,因此也有取值范围,典型的范围是:-2147483648到2147483647
整型修饰符
-
- short:用来缩短整型变量的尺寸,减少取值范围并节省内存,称为短整型
- long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长整型
- long long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长长整型
- unsigned:用来去除整型变量的符号位,使得整型变量只能表达非负整数
short int a; // 短整型 long int b; // 长整型 long long int c; // 长长整型 unsigned int e; // 无符号整型 unsigned short int f; // 无符号短整型 unsigned long int g; // 无符号长整型 unsigned long long int h; // 无符号长长整型
使用整型修饰符后,关键字 int 可以被省略:
short a; // 短整型 long b; // 长整型 long long c; // 长长整型 unsigned e; // 无符号整型 unsigned short f; // 无符号短整型 unsigned long g; // 无符号长整型 unsigned long long h; // 无符号长长整型
符号位:
-
- 有符号的整型数据,首位为符号位,0表示正数,1表示负数。
- 无符号的整形数据,没有符号位。
编码形式:
-
- 原码:正数直接使用二进制来表达,比如a=100,在内存中是 00…001100100
- 补码:负数用绝对值取反加一来表达,比如a=-3,在内存中是11…1111111101
- 注意负数的补码在取反加一的时候,符号位是不动的
溢出:超过数据所能表达的范围,称为溢出,就像汽车里程表,最大值和最小值是相邻的
进制:源码中可以使用八进制、十进制或十六进制,但实际数据在内存中一律是二进制
-
- 十进制(默认),比如1099
- 八进制,比如013
- 十六进制,比如0x6FF0A
格式控制符
-
- int 整型:%d
- short 整型:%hd, h代表half,即一半的存储字节
- long 整型:%ld
- long long 整型:%lld
- 显示不同进制的前缀: %#o、 %#x
2. 浮点型
概念:用来表达实数的数据类型
分类:
-
- 单精度浮点型(float),典型尺寸是4字节
- 双精度浮点型(double),典型尺寸是8字节
- 长双精度浮点型(long double),典型尺寸是16字节
- 占用内存越多,能表达的精度越高
float f1; // 单精度 double f2; // 双精度 long double f3; // 长双精度
浮点类型 | 最小精度 | 最大数值 |
float | 10^{-37}10−37 | 10^{38}1038 |
double | 10^{-307}10−307 | 10^{308}10308 |
long double | 10^{-4931}10−4931 | 10^{4932}104932 |
二、整形在数据中的存储
1、前导
1、类型表示了各种数据形式
2、类型规定了数据所占内存空间的大小
3、类型规定了数据内存存储的模型
常量:
变量:命名规则:数字、字母、下划线组成,并且首字符不能为数字
常变量:const
类型 | char | short | int | long | float | double |
16位系统 | 1 | 2 | 2 | 4 | 8 | |
32位系统 | 1 | 2 | 4 | 4 | 4 | 8 |
64位系统 | 1 | 2 | 4 | 8 | 4 | 8 |
内存:
物理内存(PM)效率低---MMAP------>虚拟内存(VM,一般大小为4个G)
形象化:
内存:类比教室 通常大小为4G
内存单元:类比为一间教室,一个内存单元的大小是1byte=8bits
内存块:类比为几间门牌号连续的教室
内存地址:类比为教室的门牌号,通常内存地址使用十六进制表示(0x00000000~0xFFFFFFFF)
内存值:类比为教室里边的内容(内存值也可以是地址)
寻址:
根据地址找内存空间
2、数据如何存储
首先我们知道,变量再创建的时候,会向内存申请一片连续的空间,空间的大小由这个数据的类型来确定,就比如char类型会申请1个字节的空间,int类型会申请4个字节的空间,那么字节是什么?字节可以理解为内存的长度,1个字节又是8个比特位,那么比特位是什么我们将会进行详细的介绍!
例如:
int a = 10; int b = -10;
这两个变量在内存中是如何进行存储的呢?
首先我们确实类型,是int型,那么变量a和b会向内存申请4个字节的空间来存放10和-10两个数字,那么10和-10再内存中是什么样子呢?
0000 0000 0000 0000 0000 0000 0000 1010 //10 1111 1111 1111 1111 1111 1111 1111 0110 //-10
上面提到,1 个字节是 8 个比特位,4 个字节就是 32 个比特位,上面的代码就就可以显示出来,那么每一个 0 或 1 就是一个比特位,整型数据在内存中我们是以二进制码来进行存储的,那么-10 和 10 的区别很大!那是因为数据在内存中的存储,是以补码的形式进行存储的,这里就要引入一个概念,二进制码有原码,反码和补码。那么为什么10就是原来的形式呢,在二进制这三个码中,正数的原码,反码,补码都相同,但是负数就不一样了。
int a = 10; // 原码:00000000000000000000000000001010 // 反码:00000000000000000000000000001010 // 补码:00000000000000000000000000001010 int b = -10; // 原码:10000000000000000000000000001010 // 反码:11111111111111111111111111110101 // 补码:11111111111111111111111111110110
计算机中的整数有三种表示方法,即原码、反码、补码
原码:直接将十进制按照正负数的形式翻译成二进制就可以
反码:将原码的符号位不变,其他位取反即可得到
补码:反码 + 1
对于整型来说,数据在内存中是以补码的形式存放的。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统
一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程
是相同的,不需要额外的硬件电路。
3、大端,小端的介绍
-
- 大端模式存储:
是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。 - 小端模式存储:
是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
- 大端模式存储:
4、为什么有大端和小端:
因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器)。
另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
三、浮点型在数据中存储
float num = 13.625;
1、将整数位转换为二进制
13 -->1101
2、将小数位转换为二进制
0.625 --> 101 (乘2取整,从前往后取)
3、转换为指数形式 --> 移动小数位,保证整数位仅有一位,且必须为1
1101.101 --> 1.101101 * e3
4、按照浮点数的内存模型进行存储
符号位(占1个bit位):正数为0,负数为1
指数位(占8个bit位):127+小数点移动的位数 - -> 127 +3 -- >10000010
尾数位(占23个bit位):二进制小数位,如果不足23位,则右侧补0;如果超过23位,则截取前23位。 10110100000000000000000
5、01000001010110100000000000000000 --> 41 5A 00 00
6、将当前的数据按照小端模式进行存储
41 5A 00 00 ---小端模式----->00 00 5A 41