01_C基础(编译链接、端序)
gcc:
cl → 编译
link → 链接
文件编译过程:预处理、编译、汇编、链接
预处理:处理预处理器指令,如#include、#define,生成预处理后的文件(.i)
编译:将预处理后的文件转换成汇编语言代码,进行语法检查和语义分析,生成汇编文件(.s)
汇编:将汇编文件转换成目标文件(.o)
链接:将目标文件和其他依赖项链接成可执行文件。
链接器是将编译后的目标文件(obj文件)链接成可执行文件(exe文件)的工具
obj 文件格式 → coff , exe 文件格式 → PE
编译器有警告程度, /w+数字 设置编译器警告成都 /w4最严格
/p 就是只替换,不编译
winhex能读取内存
小端序(Little Endian)和大端序(Big Endian)
小端序
在小端序中,低位字节存放在低地址,而高位字节存放在高地址。比如,一个32位整数0x12345678的存储方式如下:
地址 | 0x00 | 0x01 | 0x02 | 0x03 |
内容 | 0x78 | 0x56 | 0x34 | 0x12 |
大端序
在大端序中,高位字节存放在低地址,而低位字节存放在高地址。比如,同样一个32位整数0x12345678的存储方式如下:
地址 | 0x00 | 0x01 | 0x02 | 0x03 |
内容 | 0x12 | 0x34 | 0x56 | 0x78 |
主要区别
存储顺序不同:小端序将低位字节存放在低地址,而大端序将高位字节存放在低地址。
系统架构:不同的系统架构可能采用不同的字节序。比如,x86架构通常采用小端序,而某些RISC架构可能采用大端序。
数据传输:在网络数据传输中,通常使用大端序(也称为网络字节序),以保证数据在不同系统间的一致性。
优缺点
小端序优点:对于一些低级语言或系统编程,当操作低位字节时,小端序可能更为方便,因为低位字节位于较低地址,直接访问。
大端序优点:大端序在以人为可读形式观察数据时更为直观,因为高位字节在前。
补充:
在相同的架构下(如x8664),不同的操作系统之间,字节序一般不会改变。x8664架构标准采用小端序(Little Endian),因此,无论运行的是Windows、Linux、macOS还是其他操作系统,这些操作系统在x86_64架构下都会遵循小端序的存储方式。
具体来说:
Windows(x86_64):小端序
Linux(x86_64):小端序
macOS(x86_64):小端序
因此,在相同的x86_64架构上,不同的操作系统之间字节序保持一致,都是小端序。这保证了在这些操作系统之间进行数据交换时,数据的字节序不会引起兼容性问题。
需要注意的是,虽然x86_64架构统一使用小端序,但在一些特定情况下,如与网络协议相关的数据传输,可能会需要将数据转换为网络字节序(大端序)进行传输,然后在接收端再转换回小端序进行处理。
端序列举
不同芯片架构有不同的字节序,以下是一些常见芯片架构及其默认字节序:
小端序(Little Endian)
x86 / x86_64
常见于Intel和AMD处理器,广泛应用于个人计算机和服务器。
采用小端序。
ARM(部分配置)
ARM处理器可以配置为小端序或大端序,但大多数情况下默认使用小端序。
常见于智能手机、平板电脑和嵌入式系统。
MIPS(部分配置)
MIPS处理器也可以配置为小端序或大端序,但大多数情况下默认使用小端序。
应用于嵌入式系统和网络设备。
大端序(Big Endian)
SPARC
由Sun Microsystems(现为Oracle)开发,常见于高性能服务器和工作站。
采用大端序。
PowerPC(部分配置)
由IBM、Motorola和Apple开发,常用于旧版Mac电脑和游戏机(如任天堂GameCube、Wii)。
大多数情况下采用大端序,但也可以配置为小端序。
IBM System/370 及其后续型号
常用于大型机和高性能计算。
采用大端序。
可配置端序(Bi-Endian)
一些处理器架构支持在小端序和大端序之间切换,这种架构被称为可配置端序(Bi-Endian):
ARM
虽然默认是小端序,但可以配置为大端序。
应用于各种嵌入式系统和移动设备。
MIPS
支持在小端序和大端序之间切换。
广泛应用于嵌入式系统和网络设备。
PowerPC
可以在小端序和大端序之间配置。
应用于嵌入式系统、游戏机和服务器。
shell的重定向:
helloworld.exe > 1.txt # 将标准输出重定向到 1.txt
helloworld.exe >> 1.txt # 将标准输出追加到 1.txt
helloworld.exe 2> error.txt # 将标准错误重定向到 error.txt
helloworld.exe > output.txt 2>&1 # 将标准输出和标准错误都重定向到 output.txt
如果helloworld里是打印helloworld,就会打印到文件里