🦖作者主页:学写代码的恐龙
🦖博客主页:学写代码的恐龙博客主页
🦖专栏:【进阶C语言】
🦖语录:❀未来的你,一定会感谢现在努力奋斗的自己❀
一、数据类型的介绍
- char //字符数据类型
- short //短整型
- int //整形
- long //长整型
- long long //更长的整形
- float //单精度浮点数
- double //双精度浮点数
类型的意义:
- 使用这个类型开辟内存空间的大小(大小决定使用范围)
- 如何看待内存空间的大小
1.1、类型的基本归类
整型家族:
char
unsigned char
signed char
short
unsigned short
[ int ]signed short
[ int ]- int
int
unsigned int
signed int
long
unsigned long
[ int ]signed long
[ int ]- 为什么char类型被归整型家族呢?
因为字符在存储的时候存储的ASCII码值,ASCII是整数,所以在归类的时候,字符属于整型家族
[ int ]是什么意思呢?
表示在定义变量的时候,可以省略int
short int num; short num; //int可以省略这两种定义变量的方法相同
小科普:
对于short、int、long、ong long这四种类型来说int num = 0;和signed int num = 0等价,short num = 0;和signed short num = 0;等价,long和long long也同理。
但是对于char类型,char到底是等价于signed char还是unsigned char是取决于编译器的,并没有明确的规定。
浮点型家族:
float
double
构造类型(自定义类型)
数组类型
结构体类型(struct)
枚举类型(enum)
联合类型(union)
数组为什么也是自定义类型呢?
比如:int arr[0];,它的类型就是:int [10]。int arr[20];,它的类型就是:int [20];。可见随着数组元素个数的变化,数组的类型也在跟着变化,而数组元素的个数又是由用户自行决定的。因此数组被分到了自定义类型里面。
指针类型:
- int* pi;
- char* pc;
- float* pf;
- void* pv;
空类型:
- void表示空类型(无类型)
- 通常应用于函数的返回类型、函数的参数、指针类型
二、整型在内存中的存储
变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的
int a = 20; int b = -10;
我们都知道要为a分配4个字节的空间,那是如何存储的呢?这就需要了解接下来的知识了。
2.1、原码、反码、补码
计算机中有三种2进制表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”
正数的原、反、补码都相同
负整数的三种表示方法各不相同
原码:
直接将数值按照正负数的形式翻译成二进制就可以得到原码。
反码:
将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:
反码+1就得到补码。
对于整型来说:数据存放在内存中其实存放的是补码。为什么呢?
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
原、反、补之间的相互转化:
int main() { int a = 20; //00000000000000000000000000010100 - 原码 //00000000000000000000000000010100 - 反码 //00000000000000000000000000010100 - 补码 int b = -10; //10000000000000000000000000001010 - 原码 //11111111111111111111111111110101 - 反码 //11111111111111111111111111110110 - 补码 return 0; }
cpu中只有加法器:
int main() { int a = 1; //00000000000000000000000000000001 - 1的原、反、补 int b = -1; //10000000000000000000000000000001 - -1的原码 //11111111111111111111111111111110 - -1的反码 //11111111111111111111111111111111 - -1的补码 int c = a - b; //cpu中只有加法器,所以:减法会转换成加法进行计算 //1-1 - 1+(-1) //如果是原码相加: //00000000000000000000000000000001 - 1的原码 //10000000000000000000000000000001 - -1的原码 //10000000000000000000000000000010 - 原码相加结果,还是原码,对应10进制:-2 //可见,原码相加的结果显然是错的 //补码相加: // 00000000000000000000000000000001 - 1的补码 // 11111111111111111111111111111111 - -1的补码 //100000000000000000000000000000000 - 补码相加结果,还是补码,还是int型的整数,所以最高位1保存不了 //内存中存储:00000000000000000000000000000000 - 这本质上是补码,但是符号位是0,表示正数,,正数的原、反、补相同,所以对应十进制:0 //需要注意的是:最终的结果是二进制的原码所对应的十进制数字 return 0; }