一、gcc编译器及编译方式
1.1编译型语言
C语言的源程序—代码是给程序员去看;但是计算机只能识别01这样子的二进制数据
将.c源文件→计算机能识别的二进制文件
我们linux系统中,C语言的编译器使用的是 gcc
编译器: gcc编译器来完成这个动作。
1.2按照编译流程分步编译
预处理-->编译-->汇编-->链接
预处理:头文件的展开、注释的删除、宏定义的替换
gcc -E 3.c -o 3.i
编译:词法分析、语法分析 用来查错的
如果无误,会生成汇编文件
gcc -S 3.i -o 3.s (大写S)
汇编:将汇编文件生成二进制文件
gcc -c 3.s -o 3.o (小写c)
链接:链接库文件 生成最终的可执行文件
gcc 3.o -o a.out
执行可执行文件 ./可执行文件
一步生成 gcc 源文件.c (默认得到的可执行文件的名字: a.out)
gcc 源文件.c -o 自定义名字
二、计算机中数据的存储
计算机中数据的存储主要分为两大部分:
数值型数据 非数值型数据
2.1 数值型数据的表示方式
表示形式
有4种
二进制: 组成:0~1 用b开头, 给计算机使用 例 b0100 1000 满2进1
八进制: 组成:0~7 用0开头的 写代码用的 例 076 023 满8进1
十进制: 组成:0~9 给人看的 例10 120 80 满10进1
十六进制: 组成0~9 用0x或者0X开头的 写代码用的 例 0x98 0xac 满16进1
a~f A-F
2.1.1二进制、八进制、十六进制转十进制
二进制转十进制
例:b101011 == 从右向左 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 + 0*2^4 + 1*2^5
== 1 + 2 + 0 + 8 + 0 + 32
== 43
b1000 0110 == 134
八进制转十进制
例:067 == 6*8^1+7*8^0
十六进制转十进制
例:0x78 == 7*16^1+8*16^0
2.1.2十进制转二进制、八进制、十六进制
以100为例
2.1.3八进制、十六进制和二进制之间转换
二进制和八进制之间的转换
2^3=8 3位的2进制数表示一个8进制数
0~7用2进制表示一下
111 ---7
110--- 6
101----5
100----4
011----3
010----2
001----1
000----0
二进制转八进制
b111 101 010 == 0752
b110 011 010 == 0632
八进制转二进制
0673 == b110 111 011
十六进制和二进制之间的转换
依次类推:
2的4次方是16 4位的2进制数表示一个16进制数
10000 从0~15
1111 F
1110 E
1101 D
1100 C
1011 B
1010 A
1001 9
1000 8
0111 7
0110 6
0101 5
0100 4
0011 3
0010 2
0001 1
0000 0
十六进制转二进制
0x8ec === b1000 1110 1100
0x752 === b0111 0101 0010
二进制转十六进制
b1111 0101 1010 1101====》 0xf5ad
2.2非数值型数据的表示方式
计算机中只能识别二进制的数值型数据,但是我们实际编码的过程中,
经常会出现一些非数值型的数据,如 人名 企业名 网址 等
我们也需要保存这些数据
在代码中看到的 "hello" 'm' '8' 这些都是非数值型数据
既然需要保存,科学家们就发明了一种叫做 ascii 码的东西
在linux系统中使用 man ascii 命令 就可以查看ascii码表
每个字符都对应一个整型数据,当想存储字符的时候,
本质存储的是他对应的整型数据的二进制
常见的ascii码
'0' - '9' 48-57
'A' - 'Z' 65-90
'a' - 'z' 97-122
'\0' 0
'\n' 10
单个个字符一般都是用一个单引号引起来的,单引号中只允许出现一个字符
转义字符:
所有的ascii码都可以使用一个 \+数字 (八进制) 来表示
C语言中还定义了一些 \+字母 来表写那些无法看到的字符
如 '\0' '\n' '\t' '\r' '\a' 等
这些就称之为 转义字符 因为这些字符已经不是本来的含义了