首页 > 试题广场 >

说一说什么是大端、小端,如何判断大端和小端

[问答题]
说一说什么是大端、小端,如何判断大端和小端 
推荐

得分点

字节序

参考答案

标准回答

大端和小端指的是字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序。字节序分为大端字节序(Big-Endian) 和小端字节序(Little-Endian)。

  1. 大端字节序:是指一个整数的最高位字节(23 ~ 31 bit)存储在内存的低地址处,低位字节(0 ~ 7 bit)存储在内存的高地址处

  2. 小端字节序:是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地址处

  3. 如何判断大端还是小端:可以定义一个联合体,联合体中有一个 short 类型的数据,有一个 char 类型的数组,数组大小为 short 类型的大小。给 short 类型成员赋值一个十六进制数 0x0102,然后输出根据数组第一个元素和第二个元素的结果来判断是大端还是小端。

    #include <stdio.h>
    
    int main() {
    
        union {
            short value;
            char bytes[sizeof(short)];
        } test;
    
        test.value = 0x0102;
        if((test.bytes[0] == 1) && (test.bytes[1] == 2)) {
            printf("大端字节序\n");
        } else if((test.bytes[0] == 2) && (test.bytes[1] == 1)) {
            printf("小端字节序\n");
        } else {
            printf("未知\n");
        }
    
        return 0;
    }

延伸阅读

当格式化的数据在两台使用不同字节序的主机之间直接传递时,接收端必然错误的解释之。解决问题的方法是:发送端总是把要发送的数据转换成大端字节序数据后再发送,而接收端知道对方传送过来的数据总是采用大端字节序,所以接收端可以根据自身采用的字节序决定是否对接收到的数据进行转换(小端机转换,大端机不转换)。

网络字节顺序是 TCP/IP 中规定好的一种数据表示格式,它与具体的 CPU 类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用大端排序方式。

BSD Socket 提供了封装好的转换接口,方便程序员使用:

#include <arpa/inet.h>
// 转换端口
uint16_t htons(uint16_t hostshort);        // 主机字节序 - 网络字节序
uint16_t ntohs(uint16_t netshort);        // 主机字节序 - 网络字节序
// 转IP
uint32_t htonl(uint32_t hostlong);        // 主机字节序 - 网络字节序
uint32_t ntohl(uint32_t netlong);        // 主机字节序 - 网络字节序

// IP 字符串转换
int inet_pton(int af, const char *src, void *dst);    // 点分十进制 IP 字符串 - 网络字节序整数
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);    // 网络字节序整数 - 点分十进制 IP 字符串
编辑于 2021-09-15 14:10:10 回复(0)

1、字节序

字节顺序,又称端序尾序(英语:Endianness)。在计算机科学计算机科学")领域中,是跨越多字节的程序对象的存储规则。
在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。

2、大小端

在计算机中一般讲字节序分为两类:Big-Endian(大端字节序) 和Little-Endian。
a) Little-Endian 高位字节在前,低位字节在后。
b) Big-Endian 低位字节在前,高位字节在后。
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。



发表于 2021-11-10 20:46:04 回复(0)
大端和小端指的是【字节序】,就是数据在内存的存放顺序。大端指【高位字节】存放在内存的【低地址】处,小端是指【低位字节】存放在内存的【低地址】处。判断方法:定义一个联合体,联合体里存放一个int型数据,一个char型数组 (数组大小为int型数据大小)。 给int型的成员复制一个十六进制的数0x0102,然后根据数组第一个元素和第二个元素的结果来判断大端还是小端。s.bytes[0] (低地址)== 01 (高位字节),s.bytes[1] == 02 (低位字节),则是大端。反之,则小端。
发表于 2024-09-05 16:39:10 回复(0)
大端和小端是字节顺序和存储地址顺序相对应的两种模式,但不管哪种模式,数据都从低地址向高地址读取和写入。
其中,大端模式对应低地址存储高字节,小端模式对应低地址存储低字节。
发表于 2023-07-31 18:03:12 回复(0)
111
发表于 2022-08-20 14:43:44 回复(0)