关于大端法和小端法(CSAPP笔记)

本文深入解析字节作为数据存储单位的概念,探讨大端法与小端法在内存中存储字节的不同顺序,以及这两种方法在处理器和操作系统中的应用。通过实例,对比了在不同端序下整数的存储方式,强调了在网络数据传输和系统级编程中正确处理字节顺序的重要性。

字节的表示

数据的存储单位是字节,在大多数的机器上,一个字节的大小是8位,也就是8位的二进制数。我们知道,十六进制与二进制的转换关系是4位的二进制数可以转换为1位的十六进制数。一般地,一个字节用两位十六进制数表示。比如:[1100 1010] 就是 [0xCA]

大端法和小端法是什么?

说白了,大端法和小端法就是指的字节在内存中的存储顺序。很多对象都不是仅仅是一个字节的,也就是跨字节的,那么以哪种顺序储存就成为了问题。
不难想象,如果依顺序的方式存储的话,只有两种方式,一种正向,一种逆向。大端法是高位在前,和直接写出来的顺序是一样的,小端法则正好相反。

举个栗子:一个 int 数 12345(在 Win 系统中占用 4 个字节)

  1. 12345 转化为 16 进制 >> 0x3039
  2. 算上前面的 0, 写成以字为单位的形式:00 00 30 39
  3. 大端法:00 00 30 39
    小端法:39 30 00 00
  4. 假设第一个字节地址是0x100,则两种存储方法对应的图形表述如下图
    在这里插入图片描述

大端法和小端法的应用

对于不同的处理器和操作系统,采用的存储顺序也不同。对于绝大多数的 Intel 处理器,都采用的小端法。IBM 和 Oracle 采用的是大端法。但这一区分并不严格按照企业品牌。同时许多新的处理器支持双端法,也就是说可以经过配置实现大端法和小端法,比如 ARM 处理器。但一旦运用在实际的操作系统上,却只能选择唯一的一种模式,比如 Android 和 iOS,只能运行于小端模式。

不同的顺序会带来的问题

最明显的问题就是在数据在不同机器上传输的时候,如果两方的顺序不同,就会带来混乱。为了避免这类问题,网络中的数据传输有统一的标准,数据发送方将数据转化为统一的标准之后,接受方再将统一的标准转化为自己能用的方式。

第二个问题就是在阅读表示整数数据的字节序列的时候顺序也十分重要,通常发生在机器级的程序检验过程中。如果是小端法机器生成的代码,字节的顺序是反的。

第三个问题是在系统级编程过程中,会用到强制类型转换和联合体来引用不同于初始类型的对象,比如用short* 指向 &int 的时候,short* 指向的是 int 中的哪两个字节这类的问题。在这里插入图片描述

实践:看自己的电脑是哪种顺序

这里使用C语言,代码如下:

#include<stdio.h>
typedef unsigned char *bytePointer;
void showBytes(bytePointer p, size_t length){
    size_t i;
    for(i=0;i<length;i++){
        printf("%.2x ", p[i]);//整数用至少两位的十六进制输出
    }
    printf("\n");
}
void printInt(int i){
    showBytes((bytePointer)&i, sizeof(int));
}
int main(){
    int x=12345;
    printInt(x);
    return 0;
}

在 64 位 Win10,Intel 处理器机器上的运行结果如下,也就是小端法。

39 30 00 00

代码中的 size_t 是表示数据大小的一个整数,sizeof 函数的返回值就是 size_t.

【本文内容整理自《深入理解计算机系统》】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值