字节与小端、大端法存储。

以下仅为个人学习的记录,如有疏漏不妥之处,还请不吝赐教

字节(byte)这个术语由 Werner Buchholz在1956年创造的。在此之前,字节通常称为syllable.

历史上,字节并非一定是8位的,但现在基本都是以8位作为1个字节。最开始字节是用来为字符编码的。C语言中的用char类型为字符编码,占1字节。可是1个字节最多只能存放256组合,也就是说,1个字节最多能表示256种字符。因此需要多个字节来表示数据。这就引出一个问题。

多字节数据怎么存储?字节的排列顺序?

  在几乎所有的机器中,多字节数据都是被存储为连续的字节序列,数据的地址为所使用字节中最小的地址。

  多字节数据还存在另一个问题:字节的排列问题。通常数据的字节排列有两个通用的规则:大端法(big endian)和小端法(little endian)

  下面以0x12345678为例说明这个4字节数据在内存中的存储方式:

字节存储
内存地址 -> 0x1(最小存储地址) 0x2 0x3 0x4
大端法 -> 12(最高有效字节) 34 56 78
小端法 -> 78(最低有效字节 56 34 12

  可见,大端法和小端法是相反的。大端法最高有效字节在前,小端法最低有效字节在前。下面用C语言测试当前运行的系统是采用哪种存储方式。

#include <stdio.h>
void showByte() {
    int num = 0x12345678;
    char* cp = (char*) &p;
    for(int i = 0; i < sizeof(int); i++) {     if(0x78 == *cp) printf("小端法: ");     else printf("大端法: ");
        printf("0x%x ", *cp); // 输出:0x78 0x56 0x34 0x12 因此是小端法存储。
        cp++;
    }
}
int main() {
    showByte();
}

C语言中的目标文件中没有数据类型,那CPU如何知道在内存读取多字节数据呢?

 根据上面的showByte函数生成的汇编代码知,每条数据操作指令都带有操作数的字节大小,如第14行的movq -8(%rbp), %rax 表示要往内存地址-8(%rbp)中读取4个字节到%rax寄存器。CPU通过指令知道读取多字节数据。

 showByte:
 1     pushq   %rbp
 2     .seh_pushreg    %rbp
 3     movq    %rsp, %rbp
 4     .seh_setframe   %rbp, 0
 5     subq    $48, %rsp
 6     .seh_stackalloc 48
 7     .seh_endprologue
 8     movl    $305419896, -16(%rbp)
 9     leaq    -16(%rbp), %rax
 10     movq    %rax, -8(%rbp)
 11     movl    $0, -12(%rbp)
 12     jmp .L2
 13 .L3:
 14     movq    -8(%rbp), %rax
 15     movzbl  (%rax), %eax
 16     movsbl  %al, %eax
 17     movl    %eax, %edx
 18     leaq    .LC0(%rip), %rcx
 19     call    printf
 20     addl    $1, -12(%rbp)
 21     addq    $1, -8(%rbp)
 22 .L2:
 23     movl    -12(%rbp), %eax
 24     cmpl    $3, %eax
 25     jbe .L3
 26     nop
 27     addq    $48, %rsp
 28     popq    %rbp
 29     ret

参考文献:

  《深入理解计算机系统》第三版

原文地址:https://www.cnblogs.com/yvkm/p/10398527.html

时间: 2024-11-13 10:29:51

字节与小端、大端法存储。的相关文章

内存对齐,大端字节 &nbsp; 序小端字节序验证

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体. 例: typedef struct student { }std: 这种空结构体的模子占一个字节,sizeof(std)=1. 柔性数组: 结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素. typedef struct student { int i; char arr[];     //柔性数组成员 }std: sizeof(std)=4; sizeof求取该结构体大小是

〖Linux〗使用sed命令修改小端(little endian)存储的数据

1 #!/bin/bash - 2 #=============================================================================== 3 # 4 # FILE: hex_change.sh 5 # 6 # USAGE: ./hex_change.sh 7 # 8 # DESCRIPTION: 9 # 10 # OPTIONS: --- 11 # REQUIREMENTS: --- 12 # BUGS: --- 13 # NOTES:

【网络编程系列】一:字节顺序的大端与小端表示法

一.字节序 字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序. 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.例如:如果C/C++中的一个int型变量 a 的起始地址是&a = 0x100,那么 a 的四个字节将被存储在存储器的0x100, 0x101,0x102, 0x103位置. 根据整数 a 在连续的 4 byte 内存中的存储顺序,字节序被分为大端序(Big Endian) 与 小端序(Little Endian)两类. 然后就牵涉出两大CPU派系: Motoro

对于字节序小端和大端的思考

最近公司处理器要换核,由小端处理器ARM换成大端处理器POWERPC,bootloader以及kernel的移植工作交给了我,这是一个很有挑战的工作,自己也非常兴奋. 如此一来,当今主流的嵌入式处理器(MIPS ARM PPC)也都算接触过啦. 这几天开始动手做移植,首先要解决的是大小端的差异,进过学习思考,感觉大小端还是很有研究的必要,自己的思考总结记录在此,与大家分享,以备后用. 从网上可以查到的大小端的解释,小端是低端数据存放在低端地址,大端是高端数据存在低端地址.大小端真的就这么简单吗,

小端大端

一:什么是大小端 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放:这和我们的阅读习惯一致. 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低. 口诀:大相反(低位存高位),小相同(低位存低位),叉八六(X86计算机),必小端. 举例:假如一个int类型

网络通信之 字节序转换原理与网络字节序、大端和小端模式

原文地址:http://www.cnblogs.com/fuchongjundream/p/3914770.html 一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节.小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低

字节序之大端小端

时间:2014.07.18 地点:基地 ----------------------------------------------------------------------------- 一.跨多字节对象 相应跨多字节的程序对象,有两个点:一是这个对象的地址是什么.二是在内存中,这多个字节是怎样存储的.我们知道,多字节对象都是被存储为连续的字节序列,对象的地址即使用字节中最小的那个地址.比方一个int型数据变量x,我们说它的存储地址为0x100,即&x的值为0x100,x是一个4字节对象

网络字节码、本地字节码(大端,小端)

大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战.战争的原因:大家都知道,吃鸡蛋的时候,原始 的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须 先打破鸡蛋较小的一端,违令者重罚.然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了

网络通信时字节序转换原理与网络字节序、大端和小端模式

引言:在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节.小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双