成都网站建设设计

将想法与焦点和您一起共享

c语言判断小端字节序函数,判断大端序和小端序的程序

大端、小端字节顺序

在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式x的值为0x100。且x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。[1]

专注于为中小企业提供成都网站制作、网站设计、外贸网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业隆林免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

而存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效位在最高有效位的前面,则称小端序;反之则称大端序。在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,所以均按照网络标准转化。

对于单一的字节(a byte),大部分处理器以相同的顺序处理位元(bit),因此单字节的存放方法和传输方式一般相同。

对于多字节数据,如整数(32位机中一般占4字节),在不同的处理器的存放方式主要有两种,以内存中0x0A0B0C0D的存放方式为例,分别有以下几种方式:

示例中,最高位字节是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。

最高的16bit单元0x0A0B存储在低位。

最低位字节是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。

最低的16bit单元0x0D0C存储在低位。

当更改地址的增长方向,使之由右至左时,表格更具有可阅读性。

最低有效位(LSB)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。

最低的16bit单元0x0C0D存储在低位。

C语言 判断大端小端,怎么判断

#includestdio.h

int check()

{

union check

{

int i;

char ch;

}c;

c.i =1;

return (c.ch == 1);

}

int main()

{

int ret;

ret = check();

if(ret == 0)

{

printf("Big\n");

}

else

{

printf("little\n");

}

return 0;

}

联合体中 变量i 和ch共用同一地址空间,它们都是从低地址开始存放。变量i的值为0x00 00 00 01, 如果是小端模式则01在低地址上,ch的值如果为01则是小端模式,否则是大端模式。

用c语言写个函数测试处理器是大端还是小端程序怎么写?

写一个函数判断系统是大端还是小端。若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1.

大端格式:在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中

小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节

联合体union的存放顺序是所有成员都从低地址开始存放。

Int checkCPU ()

{

Union w

{

Int a;

Char b;

}c;

c.a=1;

return (c.b==1);

}

UNIX 网络编程 第一卷 78页 (英文版) 给出了这样一段代码:

PS: 下面代码中的unp.h是Stevens 老大自己定义的一个头文件,具体的代码在这本书的附录里有给出来.

代码

1

2 #include "unp.h"

3

4 int main(int argc ,char ** argv)

5 {

6

7 union {

8 short s;

9 char c[sizeof(short)];

10 }un;

11 un.s = 0x0102;

12 printf("%s\n",CPU_VENDOR_OS);

13

14 if(sizeof(short) == 2)

15 {

16 if(un.c[0] == 1 un.c[1] ==2 )

17 printf("big-endian\n");

18 else if (un.c[0] == 2 un.c[1] == 1)

19 printf("little-endian\n");

20 else printf("unknow");

21 }else

22 printf ( "sizeof(short) = %d\n",sizeof(short));

23 exit(0);

24 }

25

用宏判断计算机处理器是大端字节序(Big-Endian)还是小端字节序(Little-Endian)

实现同样的功能,我们来看看Linux 操作系统中相关的源代码是怎么做的:

static union { char c[4]; unsigned long mylong; } endian_test = {{ 'l', '?', '?', 'b' } };

#define ENDIANNESS ((char)endian_test.mylong)

Linux 的内核作者们仅仅用一个union 变量和一个简单的宏定义就实现了一大段代码同样的功能!由以上一段代码我们可以深刻领会到Linux 源代码的精妙之处!(如果ENDIANNESS=’l’表示系统为little endian,

为’b’表示big endian )

C语言 判断大端小端可以这样写程序吗?为什么正确答案是使用char * p=(char *)&temp;

你的指针要指向临时变量的首地址 (char *)xxx,而不是把它的内容当作指向的地址 (char *)xxx。


网站栏目:c语言判断小端字节序函数,判断大端序和小端序的程序
网页地址:http://chengdu.cdxwcx.cn/article/dsgeddp.html