zoukankan      html  css  js  c++  java
  • 大端模式和小端模式(大头序和小头序)

    大端:多字节值的大端存储在该值的起始位置;(老大站排头为大)

    小端:多字节值的小端存储在该值的起始位置;(老小站排头为小)

    例如16bit整数:0x0102,其中01即为多字节值的大端,02即为多字节值的小端。

    在网络中传输的都是大端序,但具体到某台主机CPU的实现,则有可能是大端序也可能是小端序。一般X86是小端。

    那么,如何通过程序来判断当前主机到底是大端还是小端呢?

    01 /*判断大端还是小端, 1:小端  0:大端*/
    02 int GetEndian()
    03 {
    04     union
    05     {
    06         int a;
    07         char b;
    08     } s;
    09     s.a = 0x0001;
    10     return (1 == s.b);
    11 }

    联合体union的存放顺序是所有成员都从低地址开始存放,给s.a赋值为0x01,00为a的高端,01为a的低端,如果b==1,即a的低端位于起始位置,即小端,反之为大端。

    我觉得《UNIX网络编程》(第一卷)给的例子更严密一些:

    01 /*判断大端还是小端, 1:小端  0:大端*/
    02 int GetEndian()
    03 {
    04     union
    05     {
    06         short s;
    07         char c[sizeof(short)];
    08     }un;
    09  
    10     un.s = 0x0102;
    11  
    12     if(2 == sizeof(short))
    13     {
    14         if(1 == un.c[0] && 2 == un.c[1])
    15         {
    16             printf("big-endian\n");
    17             return 0;
    18         }
    19         else if(2 == un.c[0] && 1 == un.c[1])
    20         {
    21             printf("little-endian\n");
    22             return 1;
    23         }
    24         else
    25         {
    26             printf("unknown\n");
    27         }
    28     }
    29     else
    30     {
    31         printf("sizeof(short) = %d\n"sizeof(short));
    32     }
    33  
    34     return 0;
    35 }
  • 相关阅读:
    bzoj4758: [Usaco2017 Jan]Subsequence Reversal(区间dp)
    bzoj4580: [Usaco2016 Open]248(区间dp)
    1617: [Usaco2008 Mar]River Crossing渡河问题(dp)
    bzoj21012101: [Usaco2010 Dec]Treasure Chest 藏宝箱(滚动数组优化dp)
    P2339 提交作业usaco(区间dp)
    day11
    bzoj2330: [SCOI2011]糖果(差分约束)
    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)
    P2700逐个击破(并查集/树形dp)
    bzoj1770: [Usaco2009 Nov]lights 燈(折半搜索)
  • 原文地址:https://www.cnblogs.com/10jschen/p/2646074.html
Copyright © 2011-2022 走看看