1.类型的意义:
(1).使用这个类型开辟内存空间的大小
(2).如何看待内存空间的视角
2.整型家族:
都分为无符号(unsigned)和有符号(signed)
其中char,short,int,long都属于整型家族
单独的一个int a;或者short a;long a;都是有符号的,int a其实就是signed int a;
而对于char到底是signed char 还是unsigned char标准是未定义的,取决于编译器的实现。
char字符的本质是ASCII码值,是整型,所以划分为整型家族;
3.浮点型家族:
只要是表示小数就可以使用浮点型
float的精度低,存储的数值范围小,double 的精度高,存储的数据范围更大
4.构造类型:
数组类型
结构体类型
枚举类型
联合类型
5.指针类型:
int* pi;
char* pc;
float* pf;
void* pv;
除此之外还有空类型:void(无类型)
6.为什么内存中要存二进制补码?
(1).整数的2进制表示也有三种表示形式:
正的整数,原名,反码,补码相同;而负的整数,原码,反码,补码需要计算;
原码:直接通过正负的形式写出的二进制序列就是原码;
反码:原码的符号位不变,其它位按位取反得到的就是反码;
补码:反码+1就是补码;
(2).原因在于,使用补码,可以将符号位和数值域统一处理,同时,加法与减法也可以统一处理(cpu只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
7.大端[字节序]存储:
把一个数据的高位字节序列的内容放在低地址处,把地位字节序的内容放在高地址处,就是大端字节序存储。
小段[字节序]存储:
把一个数据的高位字节序列的内容放在高地址处,把地位字节序的内容放在低地址处,就是小端字节序存储。
下面我们写一个程序来看看vs2022环境下,是那种存储方式:
这个代码我们可以看出vs环境下,存储为小端存储;
我们是利用int a=1,占4个字节,拿到第一元素的地址,解引用看是否为1,如果为1为小端存储,如果为0,则为大端存储;
这里我们也可以利用联合体来实现:
这里我们利用了联合体共用内存空间,char c和int i 共用一段内存空间;
由于i变量在内存中占4个字节,所以会开辟四个字节的空间存储i和c;
这个代码我们把i赋值为1,看c等于多少,若c也为1;则证明是小端字节存储;否则是大端字节存储;
8.下面我们来看几个题目:
(1).
(2).
(3).
这里我们可以这样看,i为有符号的20,j为无符号的10,10本身就是没有负号的,直接相加等于30;
(4).
这里为什么是大于呢?其实我们我们忽略了strlen这个库函数的返回值是size_t的,也就是无符号整型,那么3-6=-3,但是-3是无符号整型在内存中是个很大的数;所以是远远大于0的,打印大于;
(5).
这里呢,由于signed char 的数值范围是:-128~127
所以无论怎么都只有128+127=255个元素;
(6).
这里这个代码会死循环,原因在于unsigned char范围为:0~255,所以i<=255恒成立,会一直打印hello world;
总结:
(1).signed char的范围为:-128~127;
unsigned char的范围为:0~255;
(2).signed short :-32768~32767;
unsigned short:0~65535;