前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >获取本机字节顺序(端序、尾序)

获取本机字节顺序(端序、尾序)

作者头像
我与梦想有个约会
发布2023-10-21 14:19:05
3190
发布2023-10-21 14:19:05
举报
文章被收录于专栏:jiajia_deng

字节顺序简单的理解就是一组数据在内存中排列的数据,分大/小端顺序,其详细的介绍可以参考维基百科,本文主要介绍的是如何通过调试查看内存中变量的储存数据以及如何通过代码实现判断本机字节顺序。

查看内存中变量的存储顺序

我们经常使用的电脑是 intel x86 架构的 CPU,其使用的是小端序,在使用 VS 调试程序的过程中我们就能看出变量在内存中排布的方式。首选在程序中下个断点,然后运行程序,选择 “调试->窗口->内存->内存1”,这样在下方窗口中就出现一个内存的窗口。

在代码中打印一个变量在内存中的起始地址,然后从内存窗口中搜索到该地址,查看地址中存放的数据。

我们看到,一个 int 类型的变量(4个字节 4Byte)最低位 44 在内存的最地位位置上,通过这里我们就可以判断出来,我们的 CPU 是小端序。

通过代码判断本机字节顺序

维基百科上也介绍了哪些 CPU 是使用的是大端序、哪些是使用的小端序,而如果我们不清楚 CPU 型号时,可以通过编写一个程序来获得,第一种方式是将一个 4 字节的数值截断为 1 字节,通过读取这一个字节储存的数据来判断是大端还是小端序:

代码语言:javascript
复制
#include <iostream>

using namespace std;

int main( int argc, char* argv[])
{
      int i = 0x11223344;

      // 取 i 的地址,强制转换为 char* 类型,被解释为 1 个字节,再解引用该地址中一个字节的数据
      char c = *(char*)&i;

      if (c == 0x44)
      {
            cout << "Little endian" << endl;
      }
      else
      {
            cout << "Big endian" << endl;
      }
      return 0;
}

另外一种方式是借助函数 htonl() 该函数把本机字节序转换为网络字节序(大端序),我们判断如果原值等于被转换后的数据(大端序数据),那么我们的 CPU 就是大端序,反之则是小端序。代码如下(出自 C++ 黑客编程揭秘与防范):

代码语言:javascript
复制
#include <iostream>
#include <Winsock2.h>

#pragma comment ( lib, "Ws2_32")
using namespace std;

int main( int argc, char* argv[])
{
      int i = 0x11223344;

      if (i == htonl(i))
      {
            cout << "Big endian" << endl;
      }
      else
      {
            cout << "Little endian" << endl;
      }
      return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 查看内存中变量的存储顺序
  • 通过代码判断本机字节顺序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档