1. 数据类型的介绍
之前已经介绍过C语言中的基本数据类型了,主要有:
- char //字符数据类型
- short //短整型
- int //整形
- long //长整型
- long long //更长的整形
- float //单精度浮点数
- double //双精度浮点数
注意:C语言中是是没有字符串类型的。
类型的意义:
- 使用这种类型的数据所开辟的内存空间的大小。
- 如何看待内存空间的视角。
2. 类型的基本分类
【整形家族】
char :unsigned char signed char
short :unsigned short signed short
int :unsigned int signed int
long :unsigned long signed long
long long :unsigned long long signed long long
注意:C语言规定:sizeof(long)>=sizeof(int),所以long类型的占用的空间不能确定是4还是8。
【浮点数家族】
float
double
【构造类型】
数组类型
结构体类型
枚举类型
联合类型
【指针类型】
int *pi;
char *pc;
float* pf;
void* pv;
3. 整形在内存中的存储
由于变量的创建是需要空间的,具体使用的空间的大小是根据不同的类型而确定的。例如:
char ch = 0;这里ch变量是char类型,所以就在内存中占用了一个字节。
注意:char类型一般C语言官方没有明确规定是 signed char还是 unsigned char,一般的编译器,例如VS上,char就是signed char 。但是除了char以外,其他的整形都是有明确规定的,例如:int就是signed int。
那么不同的数据类型所能表示的范围是多少呢?我们可以通过以下代码来查看:
#include<stdio.h> #include<stdlib.h> #include <limits.h> int main() { printf("%d\n", INT_MAX); printf("%d\n", INT_MIN); return 0; }
那么这些数据的范围大小是怎么计算出来的呢?这里以char为例:
char占用一个字节:一个字节有8个比特位,每一个比特位只能是0或1,所以char类型在内存中组合方式一共就有256种:
注意:这里图中所有的二进制序列都是代表的是内存中的补码。由此观之,char类型的数据范围就是:-128~127。unsigned char的范围就是0~255。
由此类推:short数据范围就是:-32768~32767。其他的整数数据类型的范围小伙伴们可以自行查阅。
3.1 整形在内存中的存储
计算机中保存整数二进制的方式主要有三种,分别是原码,反码,补码。整形在内存中主要是以补码的形式保存。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位则是直接读取即可。
正数的原、反、补码都相同。
负整数的三种表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。
补码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
反码+1就得到补码。
对于整形来说:数据存放内存中其实存放的是补码。使用补码可以将其符号位和数值域进行统一运算。
原因:
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统 一处理; 同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程 是相同的,不需要额外的硬件电路。
对于数据存放内存中存放的是补码我们可以通过编译器进行直接观察。例如:-1的补码是32个1,用16进制表示就是全f。
但我们把例子换成4的时候:
这里发现内存中是有低地址到高地址存放数据的。数据的低权值位是放在低地址处的。这里就要引出新概念了:大端字节序和小端字节序。