一、编译链接过程
编译链接过程一共可以分为五个部分,预处理、编译器、汇编器、链接器、加载器。过程如下图所示
二、C语言的数据类型
C语言的数据类型分为基本类型,构造类型,指针类型,空类型,逻辑型,复数型。(本篇文章只介绍基本类型)
(一)基本类型
基本类型包括数值类型和字符类型
关于基本类型有以下需要注意的几个点:
1.整型提升
C的整型算数运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达适中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。 如果int能够表示原始数据类型中的所有值,那么这个值就会被转为int型,否则它将被转为unsigned int型。(编译器进行整型提升是为了保证运算结果的正确性,若能保证运算结果无误,也会省略类型提升的这一步操作,通常发生在表达式中存在常量操作数时。)
表达式中的字符和短整型数字在使用之前会被转化成普通整型,整型提升的规则有以下两点:
第一点:若是有符号数,前面的24位补符号位;
第二点:若是无符号数,前面补0.
2.浮点数的存储方式
浮点数的存储遵从国际标准IEEE
无论是单精度还是双精度,内存都分为三个部分,第一个部分是符号位,0代表正,1代表负;第二个部分是指数位,用于存储科学计数法中的指数数据;第三部分是尾数部分。
用二进制科学法表示的第一位都是1(任何浮点数用二进制科学法表示后都是1.xxxxxx乘以2的幂次方形式),因此计算机在存储时,会将小数点前的1省略,23bit的位数部分可以表示的精度为24bit,24bit的精度可以使float型数字精确到小数点后6位。
3.char类型的取值范围为-128到127
4.大小端
大端模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在低地址中。
小端模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在高地址中。
编程实现判断当前计算机的大小端:
#include <stdio.h>
int main()
{
int ret = check_sys();
if(ret==1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
//第一种方法
int check_sys()
{
int i =1;
return (*(char *)&i);
}
//第二种方法(利用联合)
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;
}
(二)构造类型
构造类型包括数组,结构体,共用体,枚举
1.数组([])
2.结构体(struct)
3.共用体(union)
4.枚举(enum)
(三)指针类型(*)
(四)空类型(void)
(五)逻辑型(_bool)
(六)复数型(_complex_imag)
三、操作符
1.算数操作符
加(+) 减(-) 乘(*) 除(/)
2.移位操作符
左移操作符(<<) 右移操作符(>>)
3.位操作符
按位与(&) 按位或(|) 按位异或(^)
(它们的操作数必须是整数)
下面有一道例题
链接:https://blog.youkuaiyun.com/www_cainiao_com/article/details/87099014
4.赋值操作符
+= 、-= 、 *= 、 /= 、%= 、>>= 、 <<= 、 &= 、 |= 、 =
5.单目操作符
逻辑反(!) 负值(-)正值(+) 取地址(&)操作数的类型长度(sizeof) 对一个数的二进制按位取反(~) 自加(++) 自减(–) 间接访问操作符(*)
6.关系操作符
> 、 >= 、 < 、 <= 、 != 、 ==
7.逻辑操作符
逻辑与(&&) 逻辑或(||)
&&:如果前面为假,则不计算后面
||:如果前面为真,则不计算后面
8.条件操作符
exp1 ? exp2 :exp3
9.逗号表达式
exp1,exp2 … expN
逗号表达式,从左至右依次执行,整个表达式的结果是最后一个表达式的结果。
10.下标引用、函数调用和结构成员
[]:数组中使用
():函数调用操作符
-> 或 . :访问结构体成员
C语言重要知识点总结(二)–内存结构、函数调用过程(栈帧)、宏的优缺点以及##和#的使用
C语言重要知识点总结(三)–const、volatile、extern、static、restrict、register关键字解析
C语言重要知识点总结(四)–结构体、结构体内存对齐、位段、枚举、联合
以上总结如有不足之处,希望指出,谢谢!