大端模式和小端模式

摘要:
BigEndian:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中的存储模式。16位数0x1234在大端模式下的存放方式为:16位数0x1234在小端模式下的存放方式为:32位数0x12345678在大端模式下的存放方式为:32位数0x12345678在小端模式下的存放方式为:判断大小端代码一#includeusingnamespacestd;intmain{shortx=0x1122;charx0=[0];charx1=[1];if{cout˂˂"BigEndian"˂˂endl;}else{cout˂˂"LittleEndian"˂˂endl;}returnEXIT_SUCCESS;}代码二#includeusingnamespacestd;staticunion{charc[4];unsignedlonge;}EndianTestUnion={{'l','?','b'}};#defineENDIANNESSintmain{cout˂˂ENDIANNESS˂˂endl;returnEXIT_SUCCESS;}代码三#includeusingnamespacestd;intmain{shortx=1;if{cout˂˂"LittleEndian"˂˂endl;}else{cout˂˂"BigEndian"˂˂endl;}returnEXIT_SUCCESS;}一些面试题1.对于32位x86系统,以下程序的输出是:5,2000000#include#includeintmain{inta[5]={1,2,3,4,5};int*p1=;int*p2=;printf;returnEXIT_SUCCESS;}此题内存布局如下图:
参考资料

维基百科:http://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F

百度百科:http://baike.baidu.com/link?url=J5-a6IjSYnxbQyjjkid51Zr6YivgbYZM0z2sWNBsCMbc1E3wv2ACH6HlxTjY7RGDz3qeFoTRl212WZR_L9n-rq

术语定义

Byte Endian 字节序,是指字节在内存中的组织顺序,所以也称为Byte Ordering或Byte Order。

Big Endian :大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中的存储模式。

Little Endian:小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中的存储模式。

MSBMost Significant Byte,最高有效字节,指多字节序列中最大权重的字节。

LSB :Least Significant Byte,最低有效字节,指多字节序列中最小权重的字节。

16位数0x1234在大端模式下的存放方式为(假设从地址0x4000开始存放):

大端模式和小端模式第1张

16位数0x1234在小端模式下的存放方式为(假设从地址0x4000开始存放):

大端模式和小端模式第2张

32位数0x12345678在大端模式下的存放方式为(假设从地址0x4000开始存放):

大端模式和小端模式第3张

32位数0x12345678在小端模式下的存放方式为(假设从地址0x4000开始存放):

大端模式和小端模式第4张

判断大小端

• 代码一

#include <iostream>
using namespacestd;

int main(int argc, char **argv)
{
    short x  = 0x1122;
    char  x0 = ((char *)&x)[0];
    char  x1 = ((char *)&x)[1];

    if (0x11 ==x0)
    {
        cout << "Big Endian"    <<endl;
    }
    else{
        cout << "Little Endian" <<endl;
    }

    returnEXIT_SUCCESS;
}

• 代码二

#include <iostream>
using namespacestd;

staticunion
{
    char          c[4];
    unsigned longe;
} EndianTestUnion = { { 'l', '?', '?', 'b'} };

#define ENDIANNESS ((char)EndianTestUnion.e)

int main(int argc, char **argv)
{
    cout << ENDIANNESS <<endl;
    returnEXIT_SUCCESS;
}

• 代码三

#include <iostream>
using namespacestd;

int main(int argc, char **argv)
{
    short x = 1;

    if (*(char *)&x)
    {
        cout << "Little Endian" <<endl;
    }
    else{
        cout << "Big Endian"    <<endl;
    }

    returnEXIT_SUCCESS;
}
一些面试题

1. 对于32位x86系统,以下程序的输出是:5,2000000

#include <stdio.h>#include <stdlib.h>

int main(int argc, char **argv)
{
    int  a[5] = { 1, 2, 3, 4, 5};
    int *p1   = (int *)(&a + 1);
    int *p2   = (int *)((int)a + 1);
    printf("%x,%x", p1[-1], *p2);

    returnEXIT_SUCCESS;
}

此题内存布局如下图:

大端模式和小端模式第5张

免责声明:文章转载自《大端模式和小端模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Jenkins持续集成&amp;amp;安装配置SpringBoot实战 之 异常处理篇下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[蓝牙] 6、基于nRF51822的蓝牙心率计工程消息流Log分析(详细)

开机初始化Log Log编号                       函数名                             所在文件名 1 000001: main...

替换SQL Server字段中的换行符,回车符

replace(string_expression , string_pattern , string_replacement) 第一个参数:要查找的字段。 第二个参数:要查找的字符。 第三个参数:要替换成的字符。 char(9) 水平制表符 char(10)换行键 char(13)回车键 SELECT REPLACE(detail, CHAR(13) +...

十、oracle 常用函数

一、字符函数字符函数是oracle中最常用的函数,我们来看看有哪些字符函数:lower(char):将字符串转化为小写的格式。upper(char):将字符串转化为大写的格式。length(char):返回字符串的长度。substr(char, m, n):截取字符串的子串,n代表取n个字符的意思,不是代表取到第n个replace(char1, sear...

libpcap编程实例

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pcap.h> 4 #include <errno.h> 5 #include <sys/socket.h> 6 #include <netinet/in...

019C#中使用移位运算符获取汉字编码值

在进行移位运算时,当数值的二进制数每次向左移1位就相当于乘以2,当数值每次向右移一位就相当于除以2 private void button1_Click(object sender, EventArgs e) { try { char c...

plsql和tsql常用函数比对

http://www.jb51.net/list/list_154_1.htm 数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) value from...