大小端模式

  • 定义: 数据存放在地址中,一个地址码对应一个字节。内存的低地址存放数据的低位,则存储方式为小端存储;内存的低地址存放数据的高位,则为大端存储。
  • 判断大小端的方法有两种:数据类型转换法联合体法
  • 数据类型转换法
	short a = 0x1234;
    char b = (char)a;
    cout << hex << b << endl;

运行结果:
在这里插入图片描述
说明我的系统(Ubuntu 18.04 LTS)存储数据的方式是小端存储

  • 联合体法
    联合体的存储方式是从低地址开始存,里面的数据共用一份地址
union aaa{
    short  a;   // 占用2个字节
    char b;     //占用1个字节
};

int main(int argc, char const *argv[])
{
    union aaa x;
    x.a = 0x1234;
    cout << hex << x.a << endl;
    cout << hex << x.b << endl;
    return 0;
}

运行结果:
在这里插入图片描述
说明我的系统(Ubuntu 18.04 LTS)存储数据的方式是小端存储

:移位不能用来判断大小端,但可以用来大小端转化

  • 32位系统
int swap_big_small_32(int value)
{
    return(((value & 0x000000FFU)<<24) + ((value & 0x0000FF00U)<<8) + 
    		((value & 0x00FF0000U)>>8) + ((value & 0xFF000000U)>>24));
}

int main(int argc, char const *argv[])
{
    int a = 0x12345678;
    cout << "before swap:" << "hex:" << hex << a <<endl;
    a = swap_big_small_32(a);
    cout << "after swap: " << "hex:" << hex << a <<endl;
    return 0;
}

64位系统

#include <iostream>
using namespace std;

long swap_big_small_32(int value){          //先将8字节数据转为4字节数据,最后再转回去
    return long((((value & 0x000000FFU)<<24) + ((value & 0x0000FF00U)<<8) +   
           		 ((value & 0x00FF0000U)>>8) + ((value & 0xFF000000U)>>24)));
}

long swap_big_small_64(long value){
    long a = swap_big_small_32(int(value));  //先将低32位大小端转换
    long b = swap_big_small_32(int(value>>32)); //再将高32位大小端转换
    long c = (a<<32) + b;       // 将a赋到高32位上 再与b进行或运算
    return c;
}

int main(int argc, char const *argv[])
{
    long a = 0x1234567813151719;
    cout << "before swap:" << "hex:" << hex << a <<endl;
    a = swap_big_small_64(a);
    cout << "after swap: " << "hex:" << hex << a <<endl;
    return 0;
}

运行结果:
在这里插入图片描述
大小端转化后不是完全反过来(9171513187654321),因为相邻两个数构成一个字节,字节在大小端转换后不能改变,所以相邻两个应看成一个整体进行倒序

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值