节序问题:解析大小的端判定

大小端的判断很简单,可判断了有什么用呢?这是一个难缠的问题,我最近就碰到了这样一个问题,比如,int a = 0x12345678,char* p = &a,那么p[0]等于多少呢?答案要么是0x12,要么是0x78,对吧,如果你知道他是小端(因为地球人都知道),那么你肯定就知道p[0] = 0x78,呵呵,换句话说,理解大小端对指针的运用还是有一定帮助的。

一、大小端概念
要判断电脑的大小端,肯定先要理解大小端的概念:
大端模式(Big-Endian),是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,即高低高低;
小端模式(Little-Endian),是指数据的高位,保存在内存的高地址中,而数据的低位,保存在内存的低地址中,即高高低低。

二、为什么要有大小端模式之分?
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
 
三、判断大小端的方法

方法一(强转):


代码如下:

int i = 0x12345678;
  char ch = (char)i;  //强转
  if(0x12 == ch)
  {
      //大端 
  }
  if(0x78 == ch)
  {
      //小端
  }

方法二(共用体):


代码如下:

union A{
     int i;
     char ch; 
}a;
  a.i = 0x12345678;
  if(0x12 == a.ch)
  {
       //大端 
  }
  if(0x78 == a.ch)
  {
       //小端
  }

默认为小端模式

(0)

相关推荐

  • 节序问题:解析大小的端判定

    大小端的判断很简单,可判断了有什么用呢?这是一个难缠的问题,我最近就碰到了这样一个问题,比如,int a = 0x12345678,char* p = &a,那么p[0]等于多少呢?答案要么是0x12,要么是0x78,对吧,如果你知道他是小端(因为地球人都知道),那么你肯定就知道p[0] = 0x78,呵呵,换句话说,理解大小端对指针的运用还是有一定帮助的. 一.大小端概念要判断电脑的大小端,肯定先要理解大小端的概念:大端模式(Big-Endian),是指数据的高位,保存在内存的低地址中,而数据

  • Eureka源码阅读解析Server服务端启动流程实例

    目录 环境 1.spring cloud整合eureka server demo 1.1 新建spring boot项目 pom.xml文件添加 配置文件 1.2 启动类 1.3 启动 2. spring cloud自动装配eureka server源码解析 2.1 @EnableEurekaServer注解 2.2 EurekaServerAutoConfiguration 2.2.1 查找starter 自动装配类的技巧 2.2.2 EurekaServerAutoConfiguration

  • 基于大端法、小端法以及网络字节序的深入理解

    关于字节序(大端法.小端法)的定义<UNXI网络编程>定义:术语"小端"和"大端"表示多字节值的哪一端(小端或大端)存储在该值的起始地址.小端存在起始地址,即是小端字节序:大端存在起始地址,即是大端字节序. 也可以说: 1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端. 2.大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端.举

  • c语言 数据存储与原码 反码 补码详细解析

    目录 前言 1.数据的类型介绍 1.1整形家族 2.整形在数据内存中的存储 2.1 原码 反码和补码(三种整型数的表示方法) 2.2大小端字节序序的介绍 2.3 练习 3.浮点型在内存中的存储 3.1 先举一个例子 3.2 浮点数储存的规则 前言 学习本章你会了解: 1.数据类型详细介绍 2.整形在内存中的存储:以及了解原码.补码.反码 3.大小端字节序的介绍和判断 4.浮点型在内存中的存储解析 1.数据的类型介绍 在学习数据储存之前,让我们先认识一下数据类型.以下这些数据类型是我们初学c语言时

  • 深入解读Python解析XML的几种方式

    在XML解析方面,Python贯彻了自己"开箱即用"(batteries included)的原则.在自带的标准库中,Python提供了大量可以用于处理XML语言的包和工具,数量之多,甚至让Python编程新手无从选择. 本文将介绍深入解读利用Python语言解析XML文件的几种方式,并以笔者推荐使用的ElementTree模块为例,演示具体使用方法和场景.文中所使用的Python版本为2.7. 一.什么是XML? XML是可扩展标记语言(Extensible Markup Langu

  • vue parseHTML函数源码解析start钩子函数

    目录 正文 platformGetTagNamespace 源码 isForbiddenTag 函数 addIfCondition是什么 processIfConditions 源码 正文 接上章节:parseHTML 函数源码解析 AST 预备知识 现在我们就可以愉快的进入到Vue start钩子函数源码部分了. start: function start(tag, attrs, unary) { // check namespace. // inherit parent ns if ther

  • python 解析XML python模块xml.dom解析xml实例代码

    一 .python模块 xml.dom 解析XML的APIminidom.parse(filename)加载读取XML文件 doc.documentElement获取XML文档对象 node.getAttribute(AttributeName)获取XML节点属性值 node.getElementsByTagName(TagName)获取XML节点对象集合 node.childNodes #返回子节点列表. node.childNodes[index].nodeValue获取XML节点值 nod

  • python解析xml模块封装代码

    有如下的xml文件: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?>  <root>  <childs>  <child name='first' >1</child>  <child value="2">2</child>  </childs>  </root> 下面介绍python解

  • Kafka producer端开发代码实例

    一.producer工作流程 producer使用用户启动producer的线程,将待发送的消息封装到一个ProducerRecord类实例,然后将其序列化之后发送给partitioner,再由后者确定目标分区后一同发送到位于producer程序中的一块内存缓冲区中.而producer的另外一个线程(Sender线程)则负责实时从该缓冲区中提取出准备就绪的消息封装进一个批次(batch),统一发送给对应的broker,具体流程如下图: 二.producer示例程序开发 首先引入kafka相关依赖

  • 一起raid数据恢复及回迁成功的案例

    故障发生在两块盘组成的一个raid0上,其中的一块盘亮黄灯,被raid卡踢出后,raid崩溃,下面就把当时抢救数据的整个过程进行介绍. 由于硬盘是两块SAS 300G的硬盘,先把硬盘从机器中拔出来,然后通过SAS HBA的方式直连到win的环境下,并在磁盘管理中将硬盘标记为脱机状态,以保证操作过程中是只读的,保护原始数据的安全. 在将两个硬盘底层所有扇区都镜像出来后,通过文件系统分析盘序和条带大小,使用软件虚拟重组的方式将原始raid环境搭起来后,再进一步解析ntfs文件系统后终于看到了数据,这

随机推荐