-->
当前位置:首页 > 题库

编程题:字节序(Endianness)

Luz4年前 (2022-04-05)题库774
> **LE** or **BE**, that is the question.

“内存寻址的最小单位是字节”——明白。
“每个字节有唯一的编号,称为地址”——明白。
“C++中int通常为四个字节”——了解。
“int x = 1;最低字节是1还是0?——纳尼?

事实上,这里有点小小分歧:

- 多字节数据中(例如0x12345678):
- 权重**最大**的字节称为:MSB,Most Significant Byte。(例中0x12所在字节)
- 权重**最小**的字节称为:LSB,Least Significant Byte。(例中0x78所在字节)
- 多字节数据中,**从低地址往高地址**依次存放:
- LSB...MSB,称为**小端序(LE, little-endian)**
- MSB...LSB,称为**大端序(BE, big-endian)**
- 极少数CPU使用混合序(middle-endian, mixed-endian),例如0x12345678在内存中地址由低到高为34 12 78 56。
- 有些CPU对LE、BE都支持,可以切换,称为Bi-Endianness。

扯远了,回来看几个例子,**地址从左往右增大**,那么:

txt
|00 01 02 03 04 05 06 07|
+-----------------------+
|12 34 56 78 .. .. .. ..| BE, int32_t x = 0x12345678
|78 56 34 12 .. .. .. ..| LE, int32_t x = 0x12345678

|01 00 00 00 00 00 00 00| LE: int64_t x = 1
|01 00 00 00 .. .. .. ..| LE: int32_t x = 1
|01 00 .. .. .. .. .. ..| LE: int16_t x = 1
|01 .. .. .. .. .. .. ..| LE: int8_t x = 1

|00 00 00 00 00 00 00 01| BE: int64_t x = 1
|00 00 00 01 .. .. .. ..| BE: int32_t x = 1
|00 01 .. .. .. .. .. ..| BE: int16_t x = 1
|01 .. .. .. .. .. .. ..| BE: int8_t x = 1


- BE便于阅读(人们写数字其实是BE风格)。网络协议多为BE,所以BE又称为**网络字节序(network order)**。
- LE便于类型转换。**CPU多用LE模式。**

任务:现在知道一些系统上变量的值、从其内存中导出的字节序列,请判断系统是否为小端序。
目的:建立字节序的概念。

#### 输入规格

- 由多组数据构成。每行一组,读取到EOF为止。
- 每组由一个十进制数值开头,之后是某种计算环境保存该数值的int32变量**由低到高**导出的4个字节的十六进制数值。

#### 输出规格

- 判断该环境的字节序,是小端序输出1,否则输出0。

#### 样例输入

in
1 01 00 00 00
1 00 00 00 01


#### 样例输出

out
1
0


#### 样例解释

- 第1组:小端序,输出1表示真。
- 第2组:不是小端序,输出0表示伪。





答案:若无答案欢迎评论