当前位置: 首页 > news >正文

解题-写一个程序判断当前机器的大小端存储模式 #两种方法

文章目录

前言

一、思考

二、解题

方法一:

方法二:

总结


前言

路漫漫其修远,吾将上下而求索。


想要更加详细地了解大小端字节序的相关知识可以戳此链接:http://t.csdnimg.cn/oZXDP

一、思考

”大小端字节序“中的”大小端“可以理解为数据在内存中排列顺序的问题,而”字节序“则是由于内存单元的大小为 1byte,当数据大于 1byte 的时候,就存在每一个大小为1字节数据之间顺序问题(以字节为单位讨论数据在内存中的存储顺序);

  • 大端字节序:将高位字节序的数据放到低地址处,低位字节序的数据放在高地址处;
  • 小端字节序:将低位字节序的数据放在低地址处,高位字节序的数据放在高地址处;

以在内存中存储 int i = 0x11223344; 为例来具体分析:

数据在内存中的存储的顺序关系是在以字节大小的空间之间的顺序问题,即内存单元中存放数据顺序的问题;

显然,聪明的你可能会想到使用int i =  0x00000001  ;然后看变量 i 其第一个字节空间的大小;为1 则说明为小端字节序; 为0 则说明为大端字节序;

二、解题

方法一:

如上思考分析

代码如下:

#include<stdio.h>int CheakSys()
{int i = 1;return *((char*)&i);
}
int main()
{//方法一int ret = CheakSys();if (ret == 0)printf("当前机器采用的是大端字节序\n");elseprintf("当前机器采用的是小端字节序\n");return 0;
}

在VS编译器下执行结果如下:

方法二:

思路和方法一如出一辙,但是解决方法的形式不同;

看了方法一,其核心就是:

整型变量会向内存申请 4 byte 的空间来存放数据,此时给这个变量一个值 :1 ; 然后取其第一个字节空间的数据看是0还是1;

是0则为大端字节序,因为大端字节序存储模式会将低位字节序的数据放在高地址处;

而若是1,则就为小端字节序,因为小端字节序的存储模式会将低位字节序的数据放在低地址处;

大体给人的轮廓的感觉就是,用4 byte 大小的空间存放 0x00 00 00 01 , 结果就取出它处于较低地址处一个字节空间的数据,聪明的你可能会联想到使用联合

联合,又称为共用体,即其成员共同使用空间;

代码如下:

//方法二:利用联合#include<stdio.h>int CheakSys()
{union Un{int i;char c;}u;u.i = 1;return u.c;
}int main()
{int ret = CheakSys();if (ret == 0)printf("当前机器采用的是大端字节序\n");elseprintf("当前机器采用的是小端字节序\n");return 0;
}

在VS编译器下执行结果如下:


总结

核心:整型变量会向内存申请 4 byte 的空间来存放数据,此时给这个变量一个值 :1 ; 然后取其第一个字节空间的数据看是0还是1;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • uniapp + Vue3自定义封装弹窗组件
  • Linux 数据结构 顺序表 链表
  • SpringBoot SSM vue在线作业考试系统
  • RISC-V单片机智能落地扇方案
  • 华为云征文|部署个人博客管理系统 Ghost
  • Golang 字面量的表示
  • 【Docker】容器挂载文件修改后 Commit 新镜像,挂载文件不会更新
  • 用Python实现时间序列模型实战——Day 6: ARIMA 模型的理论基础
  • R 语言学习教程,从入门到精通,R 绘图饼图(23)
  • Flink 1.14.* Flink窗口创建和窗口计算源码
  • 链动2+1与消费增值模式的协同效应
  • NestJs bull 用法
  • Linux驱动开发基础(sr04超声波模块)
  • 算法day16|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
  • filezilla使用教程(window下filezilla使用教程)
  • 2017届校招提前批面试回顾
  • css系列之关于字体的事
  • Git的一些常用操作
  • HTML5新特性总结
  • Python连接Oracle
  • spring学习第二天
  • zookeeper系列(七)实战分布式命名服务
  • 闭包,sync使用细节
  • 动态规划入门(以爬楼梯为例)
  • 缓存与缓冲
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端自动化解决方案
  • 由插件封装引出的一丢丢思考
  • 怎样选择前端框架
  • 【干货分享】dos命令大全
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #php的pecl工具#
  • #WEB前端(HTML属性)
  • (31)对象的克隆
  • (5)STL算法之复制
  • (8)STL算法之替换
  • (bean配置类的注解开发)学习Spring的第十三天
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (汇总)os模块以及shutil模块对文件的操作
  • (十八)三元表达式和列表解析
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .NET C# 操作Neo4j图数据库
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core 版本不支持的问题
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .Net 垃圾回收机制原理(二)
  • .netcore 获取appsettings
  • .NET关于 跳过SSL中遇到的问题
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件