字节序

作者: 翼动晴空 | 来源:发表于2017-04-26 14:15 被阅读27次

字节序:是由于CPU和OS对多字节变量的存储顺序不同而产生的

例如一个16位的整数,它由2个字节组成,有的操作系统会把高位字节放在内存的低地址上,有的操作系统会把高位字节放在内存的高地址上。

一般有2种表示:

  • 小端字节序:在表示变量的内存地址的起始位置存放低字节,高字节顺序存放
  • 大端字节序:在表示变量的内存地址的起始位置存放高字节,低字节顺序存放

例如变量:0xabcd,假设存放值0xabcd的内存地址的起始地址为0

  • ——小端字节序:0xab在地址15~8的位置上,0xcd在地址7~0的位置上
  • ——小端字节序:0xab在地址7~0的位置上,0xcd在地址15~8的位置上

写出一个程序,判断系统字节序类型

#include <stdio.h>

/* 联合类型的变量类型,用于测试字节序
 * 成员value的高低端字节可以由成员type按字节访问
 */
typedef union{
        unsigned short int value;                                                               /*短整型变量*/
        unsigned char byte[2];                                                          /*字符类型*/
}to;

int main(int argc, char *argv)
{    
        to typeorder ;                                                                          /*一个to类型变量*/
        typeorder.value = 0xabcd;                                                               /* 将typeorder变量赋值为0xabcd */
    
        /* 小端字节序检查 */
        if(typeorder.byte[0] == 0xcd && typeorder.byte[1]==0xab){               /*低字节在前*/
                printf("Low endian byte order"
                                "byte[0]:0x%x,byte[1]:0x%x\n",
                                typeorder.byte[0],
                                typeorder.byte[1]);    
        }
    
        /* 大端字节序检查 */
        if(typeorder.byte[0] == 0xab && typeorder.byte[1]==0xcd){               /*高字节在前*/
                printf("High endian byte order"
                                "byte[0]:0x%x,byte[1]:0x%x\n",
                                typeorder.byte[0],
                                typeorder.byte[1]);    
        }
    
        return 0;    
}

运行结果

wangande@wangande-MS-7808:~/workspace/Linux-net/source/08$ gcc check_order.c -o check_order
wangande@wangande-MS-7808:~/workspace/Linux-net/source/08$ ./check_order 
Low endian byte orderbyte[0]:0xcd,byte[1]:0xab

作者的系统为小端字节序存储

相关文章

  • Linux的socket API基本操作

    1.socket地址API 主机字节序和网络字节序 字节序分为大端字节序和小端字节序 大端字节序 = 一个整数的高...

  • C语言字节序转换API

    主机字节序转网络字节序 网络字节序转主机字节序 将字符串IP地址转换为网络字节序的整型数据 将网络字节序数据转换为...

  • 内存序、字面量、动态规划

    内存字节序 确认内存字节序 /* 确定你的电脑是大端字节序还是小端字节序 */include int check...

  • socket编程基础

    字节序 字节序分为大端字节序和小端字节序大端字节序: 是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内...

  • 深入理解Emoji(二) —— 字节序和BOM

    上篇主要了解了字符集和字符集编码的相关知识,其中有提到字节序的问题,这篇我们便深入探讨下这方面的知识。 字节序 字...

  • Linux高性能服务器入门

    第五章 Linux网络编程基础API 主机字节序和网络字节序 <5.1.1>Q:设定主机字节序和网络字节序是为了解...

  • 一文搞懂序列化与反序列化

    一、是什么 序列化:就是将对象转化成字节序列的过程。 反序列化:就是讲字节序列转化成对象的过程。 对象序列化成的字...

  • Linux高性能服务器开发

    公众号:畅游码海 更多高质量原创文章都在里面~ 主机字节序和网络字节序: 在32位机器上,累加器一次能装载4个字...

  • Linux socket编程:地址及转换

    1. 网络字节序与主机字节序 1.1 主机字节序() CPU的字节顺序类型, 小端,little endian; ...

  • cpu 字节序

    为什么会有字节序这一说法 对于单字节处理器不存在字节序,对于大于1个字节的位数的CPU,其寄存器的宽度也大于1个字...

网友评论

    本文标题:字节序

    本文链接:https://www.haomeiwen.com/subject/esmizttx.html