大端/小端的存储模式

2017年11月23日
大端/小端的存储模式
1.大端:

  如果是将高字节的数据存储在低地址,低字节数据存储在高地址,这种存储模式就是大端模式;
2.小端:

  如果是将高字节的数据存储在高地址,低字节数据存储在低地址,这种存储模式就是小端模式;
3.对大小端模式的测试方法:
1).使用union共用体进行测试:

#include <stdio.h>
#include <stdlib.h>
//默认为小端模式;
//使用共用体测试;
union test
{
int a;
char b;
};
void main()
{
union test t1;
char b;
t1.a=1;
b=t1.b;
printf("%d\n",b);//输出结果是1;
}

2).使用指针的方式:

#include <stdio.h>
#include <stdlib.h>
//默认为小端模式;
//使用共用体测试;
void main()
{
int a=0;
char b=*((char*)(&a));
printf("%d\n",b);//输出结果是1;
}

4.看似可行实则不行的测试大小端方式:位与(&)、移位(>>)、强制类型转化(type)
(1)位与运算。
结论:位与的方式无法测试机器的大小端模式。(表现就是大端机器和小端机器的&运算后的值相同的)
理论分析:位与运算是编译器提供的运算,这个运算是高于内存层次的(或者说&运算在二进制层次具有可移植性,也就是说&的时候一定是高字节&高字节,低字节&低字节,和二进制存储无关)。
(2)移位
结论:移位的方式也不能测试机器大小端。
理论分析:原因和&运算符不能测试一样,因为C语言对运算符的级别是高于二进制层次的。右移运算永远是将低字节移除,而和二进制存储时这个低字节在高位还是低位无关的。
(3)强制类型转换
同上;

5.通信系统中的大小端(数组的大小端)
(1)譬如要通过串口发送一个0x12345678给接收方,但是因为串口本身限制,只能以字节为单位来发送,所以需要发4次;接收方分4次接收,内容分别是:0x12、0x34、0x56、0x78.接收方接收到这4个字节之后需要去重组得到0x12345678(而不是得到0x78563412).
(2)所以在通信双方需要有一个默契,就是:先发/先接的是高位还是低位?这就是通信中的大小端问题。
(3)一般来说是:先发低字节叫小端;先发高字节就叫大端。实际操作中,在通信协议里面会去定义大小端,明确告诉你先发的是低字节还是高字节。
(4)在通信协议中,大小端是非常重要的,大家使用别人定义的通信协议还是自己要去定义通信协议,一定都要注意标明通信协议中大小端的问题。

原文地址:https://www.cnblogs.com/weiyouqing/p/9039820.html

时间: 2024-10-12 13:42:48

大端/小端的存储模式的相关文章

大端小端数据存储方式

大端:BigEndian 大端模式第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节),高字节在低地址, 低字节在高地址. 小端:LittleEndian  小端模式第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节),高字节在高地址, 低字节在低地址. egg: 从内存地址为0x0000开始有以下数据:0x1234abcd BigEndian: 低地址 --> 高地址 0x0000  0x0001  0x0002  0x0003 0x12

大端小端(2)

请问下列代码的输出结果有可能是哪些()? #include<stdint.h> #include<stdio.h> union X{     int32_t a;     struct      {          int16_t b;         int16_t c;     }; }; int main() {      X x;     x.a=0x20150810;     printf("%x,%x\n",x.b,x.c);      retur

[小知识]如果使用union判断机器内存是大端序存储还是小端序存储 @ C

比如int i = 1,如果是小端序存储,那么在内存中应该是这样的:0x01 0x00 0x00 0x00:如果是大端序存储的,在内存中应该是:0x00 0x00 0x00 0x01. 那么如何编程来判断机器是大端序存储呢还是小端序存储呢? 上代码: #include <stdio.h> int isBigEndian() { union { int i; char c; }test; test.c = 1; return test.i != 1; } int main() { printf(

大端小端的判断

大端小端的判断 1.联合体(共用体) union U { char s[9]; int n; double d; }; 联合体和结构体的定义和使用是一样的,就不详细的赘述.必须要记住:联合体所有的成员变量都是共享同一块内存的,从相同的起始地址进行赋值.也就是给联合体的一个成员变量赋值的时候,就会改变其他成员变量的值. 联合体的大小: 对于计算一个联合体的大小(共用体)来说,不同的编译器计算的结果是不同的. VS2013: union U { char s[9]; int n; double d;

从大端小端开始

首先附下百科的解释. 大端模式:数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放: 小端模式:数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致. 概念上并不难理解,只是有时容易混淆. 个人的记忆方法是:将数据当做一个字符串顺序处理,从左往右看,如果每个字符(数

大端小端格式详解

1. 什么是大端,什么是小端: 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中: 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 2.为什么会有大小端: 为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit.但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处

栈增长方向与大端/小端问题

转:http://www.cnblogs.com/xkfz007/archive/2012/06/22/2558935.html 栈增长和大端/小端问题是和CPU相关的两个问题.在内存管理中,与栈对应是堆.对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向:对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长.在内存中,“堆”和“栈”共用全部的自由空间,只不过各自的起始地址和增长方向不同,它们之间并没有一个固定的界限,如果在运行时,“堆”和 “栈”增长到发生了相互覆盖时,称为“

字节序之大端小端

时间:2014.07.18 地点:基地 ----------------------------------------------------------------------------- 一.跨多字节对象 相应跨多字节的程序对象,有两个点:一是这个对象的地址是什么.二是在内存中,这多个字节是怎样存储的.我们知道,多字节对象都是被存储为连续的字节序列,对象的地址即使用字节中最小的那个地址.比方一个int型数据变量x,我们说它的存储地址为0x100,即&x的值为0x100,x是一个4字节对象

socket 大端 小端 转换 (转)《二》

socket 大端 小端 转换 (转)<二> http://blog.csdn.net/kukumouse/article/details/2270356 (1)对于位域结构中的变量来说,其长度不能跨越字节,也就是说不能超过8位.当然如果设置空白位(无名变量,仅仅用作占位的)是没有这个限制的.如果一个字节剩下的位长度不够一个位域,那么从下个字节开始,也可有意置某个位域从下个字节开始.例如: struct bits4_5 {  //一个从到小的存放顺序结构体 unsigned : 10;  //