c 大小端问题

原创 2015年07月06日 17:02:33

背景知识:
大小端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。
计算机中的应用:
大端方式,CPU对操作数的处理是从高地址到低地址顺序存放数据的低位、高位,小端方式,CPU对操作数的处理是从低地址到高地址顺序存放数据。采用大端方式 进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。

//方法一:linux内核源码中对大小端的处理方法,利用Union
static union { char c[4]; unsigned long mylong; } endian_test = { { 'l', '?', '?', 'b' } };

#define ENDIANNESS ((char)endian_test.mylong)

void main()
{   
    if(ENDIANNESS == 'l')
    {
        cout<<"小端模式"<<endl;
    }
    else 
    {
        cout<<"大端模式"<<endl;
    }

//方法二:指针法,利用指针,取地址&
//C语言中,数据类型都是从内存的低地址向高地址扩展,取址运算"&"都是取低地址
int x=1;
if(*(char*)&x==1)//判断x的低地址存储内容
    printf("little-endian\n");
else
    printf("big-endian\n");


cin.get();
}

对方法一的说明:
1.字符数组c中地址最大的元素显然是c[3],地址最小的元素是c[0]。
2.大端模式则会将字符l,?,?,b从高地址到低地址存储,即c[3]=l,c[0]=b;而若是小端模式则c[0]=l,c[3]=b;
3.利用union特性,数据成员共享内存空间,union中元素的起始地址相同————位于联合的开始
4.获取mylong低地址内容后,间接得到c[0]的值,即可知道大小端了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

【Endian】C语言的大小端及其简单的判断。

Endian ,即我们说的端模式,最开始这个词出自于《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为...
  • Fehin_
  • Fehin_
  • 2016年05月16日 23:34
  • 592

c语言,java类型转换时遇到的大小端问题

帮同学解决crc-16码的问题时,遇到一个小问题,觉得挺有价值的,故在此mark一下。 场景如下: 有以下c++代码 unsigned char data[] = "testtest"; ...
  • lxq8989729
  • lxq8989729
  • 2016年01月07日 02:53
  • 556

C语言二进制文件读写以及大小端转换

因为工作需要所以需要将文件用二进制方式读取。网上资料比较少,所以我再次把自己的实践过程mark一下。 并且由于代码可能需要在不同的机器上运行,所以还需要考虑一下大小端转换问题。 先看下面的代码,然...
  • liuyanfeier
  • liuyanfeier
  • 2017年03月09日 11:37
  • 1420

数据存储的大小端问题

为什么会有大小端模式之分呢? 这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型...
  • qq_35524916
  • qq_35524916
  • 2017年03月14日 19:47
  • 269

【C语言】大小端的判断

在文章的开头我首先要介绍一下大小端的概念: 大端模式: 是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地...
  • liuxiaoqian_
  • liuxiaoqian_
  • 2015年05月17日 00:21
  • 1835

C#做客户端Java做服务器使用Socket通信的大小端序和行结束符的问题

在项目中需要用C#做客户端,Java做服务器,直接使用Socket通信。通信过程中由于C#用的是小端序,Java使用的是大端序。C#在向服务器发送数据时,需要将字节数组的大端序》小端绪。还有在发送到J...
  • baidu_39447417
  • baidu_39447417
  • 2017年10月16日 09:03
  • 275

C语言怎么简单测试为大小端模式

注:本文为博主原创,转载请注明出处! 1、什么是大小端模式? 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地...
  • slience_J
  • slience_J
  • 2016年07月27日 19:23
  • 3258

关于机器大小端的判定

关于大小端:              (本人在这个大小端问题上栽倒好多次了)         大端存储:高字节存储在低地址中,即高位先存;         小端存储:低字节存储在高地址中,即低...
  • bitboss
  • bitboss
  • 2016年04月26日 20:07
  • 1195

int*转换成char*,求strlen,涉及大小端问题以及栈

#include #include int main() { int a[2000]; char *p = (char*)a; for( int i = 0; i < 2000; i++) a[i] ...
  • wenqiang1208
  • wenqiang1208
  • 2017年04月06日 13:19
  • 298

字节序问题--大小端问题

字节序问题--大端法小端法 转自:http://blog.csdn.net/sunjiajiang/article/details/7163338 分类: ARM 2011-12-29 2...
  • yeh201111
  • yeh201111
  • 2012年11月15日 21:21
  • 2549
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c 大小端问题
举报原因:
原因补充:

(最多只允许输入30个字)