加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – big endian和little endian值是否可移植?

发布时间:2020-12-16 09:55:32 所属栏目:百科 来源:网络整理
导读:你好,我有一个小端dout和大端的小dout我知道这个问题已经问过n次但我无法弄清楚以下几点 让我们把int i = 10它以二进制形式存储为00000000 00000000 00000000 00001010在堆栈部分如下: – 00000000 |00000000 |00000000 |00001010 // In case of little end
你好,我有一个小端dout和大端的小dout我知道这个问题已经问过n次但我无法弄清楚以下几点

让我们把int i = 10它以二进制形式存储为00000000 00000000 00000000 00001010在堆栈部分如下: –

00000000 |00000000 |00000000 |00001010   // In case of little endian
MSB-------------------------------------------LSB

大端

00001010 |00000000 |00000000 |00000000   // In case of in big endian
MSB-------------------------------------------LSB

在这个小端和大端都将给出相同的输出10?

那么这些小端和大端的用途是什么?

我被要求实现代码,这些代码可以在我的访谈中对所有大小系统都是可移植的.我回答说:

compiler will do it self like if int i=10 in little endian then in big endian too it is 10 as output

这个答案是否正确?

解决方法

00000000 | 00000000 | 00000000 | 00001010 // big    endian

00001010 | 00000000 | 00000000 | 00000000 // little endian

无论数据是以big endian还是little endian模式存储,大多数情况下,只有当你试图通过指针访问内存中较小部分的变量时才会很重要,就像试图通过a访问32位整数的最低有效字符一样指向字符的指针或带有字符数组的联合.另一个问题的例子是,如果您将文件中的数据直接读取到32位整数数组中,或者从32位整数数组中读取数据.文件中的数据通常也以小端或大端模式存储.

据我所知,没有通用的编译时方法来确定cpu是以big endian模式还是little endian模式运行(特定的编译器可能已为此定义).您可以使用32位整数和大小为4的字符数组的并集编写测试代码.然后将union中的整数设置为10,并检查union字符数组[0]是否包含10表示小端模式,或者如果联合字符数组[3]包含10,这意味着大端模式.可以使用其他方法来确定CPU是处于小端还是大端模式.

一旦确定cpu是处于小端还是大端模式,就可以包含条件代码来处理这两种情况,例如来自/来自32位整数数组的文件I / O.如果您希望文件数据处于大端模式,但您的cpu处于小端模式,则必须在写入之前或从文件读取之后反转每个整数的字节.

无论cpu模式如何,您还可以编写代码序列以大端模式存储数据.如果已经处于大端模式,它将浪费时间,但它适用于大端和小端模式:

char     buffer[256];
char *   ptr2char;
uint32_t uint32bit;
/* ... */
    ptr2char = buffer;    /* store uint32bit in big endian mode */
    *ptr2char++ = (uint32bit >> 24)&0xff;
    *ptr2char++ = (uint32bit >> 16)&0xff;
    *ptr2char++ = (uint32bit >>  8)&0xff;
    *ptr2char++ = (uint32bit      )&0xff;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读