*************************************************正文开始*************************************************
1、数据类型介绍
前面我们已经学习了基本的内置类型(C语言已经有的类型叫做内置类型)
char short int long long long float double
以及他们所占存储空间的大小。
类型的意义:
1.使用这个类型开辟内存空间的大小(大小决定了适用范围)。
2.如何看待内存空间的视角。
1.1 类型的基本归类
整型家族:
char unsigned char signed char//char = signed char 是取决于编译器的 short unsigned short [int]//这里的int可以不写,下面一致 signed short[int]//short = signed short ,signed 可省略 int unsigned int signed int //int = signed int ,signed 可省略 long unsigned long [int] signed long [int]//long = signed long ,signed 可省略
注:
1.字符存储和表示的时候本质上使用的是ASCII码值,ASCII码值是整数,因此字符类型也归类到整型家族;
2.数值在分类的时候有正有负,因次就存在 unsigned(无符号,只有正),signed (有符号,可正可负),平时写的 int = signed int,signed可省略 。但是 char == signed char 是取决于编译器的(见到的编译器上大多是等于的)。
浮点型家族:
float double
构造类型(自定义类型):
>数组类型 //int arr[5],char str[10] >结构体类型 struct >枚举类型 enum >联合类型 union
指针类型:
int *pi;//+-1跳过几个字节看指针的类型,解引用访问几个字节也是看指针类型 char *pc; float *pf; void *pv;
空类型:
void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型。
函数不希望有任何返回值就用 void ;函数的参数写成 void 代表了这个函数不需要参数;void* p 是无具体类型的指针。
2、整型在内存中的存储
一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。
那接下来我们他谈数据在所开辟的内存中到底是如何存储的?
比如:
int a = 20; int b = -10;
我们知道为 a 分配四个字节的空间。
那如何存储?
下来了解下面的概念:
2.1 原码、反码、补码
计算机中的整数有三种2进制的表示方法,即原码、反码、补码。
三种表示方法均有符号位和数值位两部分,符号位都是用‘0’表示“正“,用‘1’表示”负“,而数值位只要把这个数字表示清楚就可以。
正数的原、反、补码都相同。
负整数的三种表示方法各不相同。
举例:
int main() { int a = 20; //原码:00000000 00000000 00000000 00010100 //反码:00000000 00000000 00000000 00010100 //补码:00000000 00000000 00000000 00010100 int b = -10; //原码:10000000 00000000 00000000 00001010 //反码:11111111 11111111 11111111 11110101 //补码:11111111 11111111 11111111 11110110 return 0; }
原码
直接将数值按照正负数的形式翻译成二进制就可以得到原码。
反码
将原码的符号位不变,其他位一次按位取反就可以得到反码。
补码
反码+1就得到补码。
对于整型来说:数据存放内存中其实存放的是补码。
我们为了更加清楚,使用调试可以观察一下内存中如何存储:
正数的原反补码相同说明不了问题,我们来看负数的
这里是为了方便展示所以用的 16进制,在内存中就是以 2进制存储的。2进制数转换为 16进制数就是 ff ff ff f6。
Q:为什么数据存放内存中其实存放的是补码呢?
A:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互交换,其运算过程是相同的,不需要额外的硬件电路。
这段话有点难理解,我们举例来说明一下:
我们以 1 - 1 来说。上面的话说 CPU 只有加法器,而我们这里却是用减法处理的,因此我们改写为 1+(-1),而CPU就是这样来做的。
int main() { 1 + 1; 1 + (-1); //1的补码: 00000000 00000000 00000000 00000001 //-1的原码:10000000 00000000 00000000 00000001 //-1的反码:11111111 11111111 11111111 11111110 //-1的补码:11111111 11111111 11111111 11111111 //1+(-1)补码相加:1 00000000 00000000 00000000 00000000 return 0; }
分析:
这也说明了内存中存储的是补码。