• C语言大小端判断


    大小端字节序

    介绍

    内存是以字节为单位读写的,其最小的读写单位就是字节。故如果在内存中只写入 1个字节,1 个内存的存储单元便可将其容纳了,只要访问这一内存地址就能够完整取出这1字节。

    常见 CPU 的字节序如下:

    (1)大端字节序: IBM 、Sun 、PowerPC

    (2)小端字节序: x86 、DEC

    ARM 体系的 CPU 则大小端字节序通吃,具体用哪类字节序由硬件选择。

    【补充】网络字节序就是大端字节序,所以在 x86 架构上的程序在发送网络数据时,要转换字节顺序。

    定义

    Big-Endian和Little-Endian的定义如下:

    • Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

    • Big - Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

    画个图,更好理解一下

    (1) 大端模式:

    低地址 --------------> 高地址

    地址0x1000x1010x1020x103
    数值01020304

    (2) 小端模式:

    高地址 --------------> 低地址

    地址0x1000x1010x1020x103
    数值04030201

    程序判断

    方法一

    #include 
    
    int main()
    {
        int value = 1;
        if (((char*)&value)[0]) {
            printf("Little endian\n");
        }
        else {
            printf("Big endian\n");
        }
        return value;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    解释:

    (*(char*)&value):&value取出value的在内存中的地址,int型为4个字节.
    
    如果用内存表示的话,可以分为2种情况
    
    1.小端储存
    [1000][0000][0000][0000]
    2.大端储存
    [0000][0000][0000][1000] 
    
    之后强制类型转换为char* ,char指针只能取出一个字节的值
    
    接着判断是0还是1.
    
    如果是1,那么就是小端储存。否则是大端储存。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    方法二

    #include
    
    using namespace std;
    
    int arr(){
    	union{
    		int i;
    		char c;
    	}un;
    	un.i = 1;
    	return un.c;
    }
    int main(){
    	int  x =arr();
    	if (x== 1){
    		printf("小端");
    	}
    	else{
    		printf("大端");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    解释:

    由于共用体的特性i与c共用一块内存。
    
    其中i为int 型占4个字节,c为char型1个字节;
    
    那么就转化为方法一的判断了
    
    如果用内存表示的话,可以分为2种情况
    
    1.小端储存
    [1000][0000][0000][0000]
    2.大端储存
    [0000][0000][0000][1000]
    
    接着判断是0还是1.
    
    如果是1,那么就是小端储存。否则是大端储存。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    参考资料:

  • 相关阅读:
    算法训练(leetcode)第二十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
    免费的样机素材,拿走不谢
    C# 设计模式 行为型模式 之 解释器模式
    通用网络协议
    Linux(CentOS-7)-全面详解(学习总结---从入门到深化)
    js字符串方法复习
    计算机网络学习笔记
    # ruby安装设置笔记
    file_put_contents锁的问题
    Qt QFile文件操作详解
  • 原文地址:https://blog.csdn.net/weixin_42888638/article/details/127422419