C/C++中大小端判断

19 篇文章 0 订阅

1 什么是大端、小端?

整数的表示作为计算机入门的第一步,在计算机内部用0、1表示,存储顺序有两种,分别是小端、大端
小端序(little-endian)是指将表示整数的低位字节存储在内存地址的低位,高位字节存储在内存地址的高位。相反大端序(big-endian)低字节存储在内存的高位。
一个例子
下标是一个内存地址,从0x100开始的哈
在这里插入图片描述
在这里插入图片描述

2 两种简单的方式判别大小端

2.1 使用union的特性

下面定义一个union,里面有两个成员,一个是int、另外一个是char。
预备知识:

  1. union某个时间点只能表现一个变量值。如下。要么表现出int,要么是char
  2. 实际分配的内存空间是体积最大的那个变量,在这里就是int,它比char大
  3. 最后说一下,如果想初始化union,只能用第一个成员的值进行初始化,可以整体拷贝、赋值等
union {
    unsigned int bytes;
    unsigned char lowerByte;
} block;

下面就是主函数,只需要先向bytes写1,如果是小端存储,则最低字节,也就是char,里面存储的是1,大端的话就是0了。

    block.bytes = 1;
    cout << (block.lowerByte ? "little-endian" : "big-endian") << endl;

2.2 强转成char*

其实第二种方法的原理和第一种方式一致,也是想办法拿到最低字节的数据,也就是一个char
先定义一个int,若int是4字节,小端存储,那么最低字节应该是1,反之,是0
只需要强转char,之后读出来就好了。

    unsigned int bytes = 1;
    cout << (*((char *)(&bytes)) ? "little-endian" : "big-endian") << endl;

3 指针的强大

最后说一句,数据用什么形式存储,接着用什么形式读取,可保证数据的一致性。但是我用int存,用char读,则结果会发生改变。相对于我只读取了1/4的内容,因此指针对数据解释性是由程序员决定的,这也表现了指针的强大,尤其在viod*上,搞清楚弄明白后,合理的注释是必要的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值