多个角色: 编程语言、编译器、磁盘、内存、CPU
在字节序里他们都扮演什么样的角色?
CPU决定字节序。x86架构的CPU都是小端字节序,意味着当CPU要从存储器(可能是寄存器、内存)中读取多字节数值时,CPU是按照小端来计算多字节对应的最终的数值,比如内存中存储的一个32位数值(例如int)的物理存储顺序为:0x78 0x56 0x34 0x12,从左往右地址由低到高,CPU指令在使用这个32位数的时候,按照小端字节序计算最终值就是 0x12345678。
编程语言是没有字节序的概念的,编程语言已经抽象出来了数据类型,比如c语言的int、char、long,汇编中的dd、db、dw,虽然名字不一样,本质上都代表不同字节数的数值。
编译器会将编程语言中的数据类型按照CPU指定字节序编译成指定的字节流,比如编译x86 CPU架构下的程序都是会按照小端字节序来编译成最终的二进制数,比如在c语言中定义一个 int a = 0x12345678,编译以后的二进制文件中存储的从低地址到高地址依次是: 0x78、0x56、0x34、0x12。
硬盘存储编译器编译的二进制文件,在二进制文件中已经是按照指定字节序存储。
操作系统在加载二进制文件时,不会处理字节序问题,操作系统只负责把二进制文件原模原样加载到内存里,所以内存中存储的二进制内容和在磁盘中的是一样的,最终CPU在取内存中对应数据时才会处理字节序。