首先必须强调C语言一种强类型语言,它所要使用的每个对象都必须具有声明类型,切它的类型不可变;(必须先定义,后使用)
再者在C的编译过程中有4种文件:
源文件.c文件;(文本文件)
进行预编译以后.i文件;(文本文件)
编译后的目标文件.obj或者.o文件;(2进制文件)不可执行
链接后的.exe的可执行文件。
在执行文件时,会分配4个区域:
.Code(代码区)
.date(数据区)
.heap(堆区)
.stack(栈区)
两个凡是:
凡是在函数外定义的变量在数据区
凡是在函数内定义的函数在栈区
类外(static)静态
静态会使局部变量存储在数据区
为什么在执行文件时,会分配4个区域:
为什么要进行预处理,编译,链接
预处理将#中的库里面的代码导出到代码中,以方便,调用的使用,编译是为了将文本文件转换成2进制文件以供给电脑识别
类型:
在C语言中基本类型分为char short int int
long int long long double float long double bool
类型 |
字节 |
char |
1 |
short int |
2 |
int |
4 |
long int |
4 |
long long |
8 |
double |
8 |
float |
4 |
long double |
8/12 |
bool |
1 |
1字节=8bit;1bit代表一位0或者1;
因此我们可以得出char等类型数据范围char有一字节就是8位也就是char能代表2的8次方个数256位数有符号位的话就是-128-----127,如果没有符号位的话也就是0-255;
原码,补码:
众所周知C语言有原码和补码两种,之间的转换方式也是,如果原码为正数,那么补码等于原码,如果原码为负数,那么补码等于原码取反加一;
那为什么要使用补码呢?为什么负数的补码等于原码取反加一呢?
首先我们的计算机其实是没有其他运算的,它只有加法运算;那么减法怎么实现呢?我们伟大的计算机人发明了补码,类如5-5
他就等于0000 0101与1111 1011相加,相加后它溢出了一位所以计算机输出的就是0000 0000;
类型的扩充:
类如将char扩充为int则需要记住从小的类型扩充成大的类型;如果数据类型是有符号的则扩充符号;无符号的扩充0;大类型缩成小类型,直接切断;
因为我们的系统是32位所以在运算过程中会开辟4字节进行运算
且我们的计算机是低低地址高位高地址的小端存储。
思考题 :
char a=-5; unsigned int x=10;
a在电脑内存中的存储应该是补码1111 1011(-5)
x在电脑内存中的存储应该是0000 0000 0000 0000 0000 0000 0000 1010(10)
根据不同类型的数值比较,都是要先转化为同样类型的数值,然后再比较。signed型会默认变成unsigned型,小字节会默认变成大字节类型;
1111 1111 1111 1111 1111 1111 1111 1011(251)a
显然a>x
输出应为-5>10