C 到可执行文件的过程

C 标准

1987年,K和C两个人合著了一本书,被认为是第一版公认的标准,简称 K&C 或 经典 C。
这本书的附录中的“C 语言参考手册”已成为实现 C 的指导标准。UNIX 实现提供的库成了标准库。

美国国家标准协会 American National Standards Institute 在1989年定义了 c 和 c 标准库,
国际化标准组织采用了这套,即 ANSI/ISO ,又称之为 C89 或 C90 。业界人士通常称之为 ANSI C。

ANSI/ISO 联合协会颁布 C99 。虽然颁布很长时间,但是很多编译器并没有完成所有的 C99 的实现。
c99 目标:1.国际化。2.满足64位处理器。3.使用科学和工程项目中的计算。

C11 不再那么强调“信任程序员”的目标。C99 的特性成为 C11 的可选项。添加了支持多处理器计算机。

C 语言执行过程

  1. 计算机只会 0 和 1。也就是机器语言。
  2. 人不可能一直写01代码。想到用 ADD 代替01加法运算,发明了第二代语言,汇编语言。
    但是计算机看不懂,需要翻译,将汇编语言翻译成机器语言的程序就叫做 汇编程序。
  3. 汇编语言还是不够方便,发明高级语言。编译就是把高级语言转化等效的汇编语言,再将汇编语言会变成机器代码。
1. c 源程序
2. 编译预处理  读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。 
3. 编译成汇编代码
4. 优化  
5. 汇编
6. 链接程序
5. 二进制可执行文件

C 只规定存储空间 short 不能多于 int,long 不能少于 int。
现在常见配置:long long 64;long 32;short 16;int 16 or 32;

整型常量会被编译器成对应大小的类型。如果要设置为更大的类型请加修饰符。12ULL,110UL,140L;
整型溢出:
int=2147483647
2147483647=>%d=>2147483647
2147483648=>%d=>-2147483648
2147483649=>%d=>-2147483647

unsigned int=4294967295
4294967295=>%u=>4294967295
4294967296=>%u=>0
4294967297=>%u=>1

c运行常量后缀大小写,但在转化说明中(%d)只能小写。

short end = 200;
printf("%hd %d", end, end);
// 200 200
int 类型被认为是处理整数类型时最高效的类型,所以当 short 和 int
类型大小不同的计算机中,给函数做传递时,编译器会把 short 转化成 int。

c 语言把 字符常量 视作 int 型而不是 char 型。
char grade='FASE';
则 grade 值是 E

字符 '\007' '\07' '\7' 都会解释为八进制
'\x41' '\x041' 十六进制
有的编译器把 char 实现为有符号的,有的实现为无符号。请参考文档。

浮点数
float 32位,double 64位
精度指的是有效位
float 类型至少有6位有效数字,取值范围最少是 10的-37次方到正的37次方。8位表示指数,24位表示尾数。
double 类型,有的是将多的32位都给有效位,提高精度。有的是分散给尾数和指数。无论哪种,有效位必须大于等于13位。
long double 只保证至少与 double 的精度相同。
默认:编译器认为浮点型常量是 double 类型的精度。
some = 0.3 * .31;
两个64位的 double 类型相乘然后截断成 float。虽然精度更高,但是减慢程序运行。可以强制 some = 0.3f * .31F;
C99 新浮点型常量格式:Oxa.1fp10
打印十进制记数法 double 和 float 都是:%f。打印指数记数法 %e。十六进制指数记数法 %a,%A。
打印 long double %Lf,%La,%Le.
未给函数原型中显式说明参数类型的函数,如 printf,编译器会把 float 类型的值自动转化为 double。
浮点数的溢出
double too=3.4E38*100.0f;
printf("%e",too);  // 3.400000e+40

float too=3.4E38*100.0f;
printf("%e",too);  // inf

你可能感兴趣的:(C 到可执行文件的过程)