深度解剖数据在内存中的存储(3)

82 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

:old_key:判断大小端

我们已经知道有大小端两种存储模式,而我们要如何判断一台机器是小端存储,还是大端储存呢?也就是判断当前机器的字节序?

我们可以设计几个程序,来验证该不同机器的字节序。 设计思路 我们可以想办法将某一地址处存的字节数据拿出即可判断,如果高地址低字节位,说明是小端存储,否者就是大端存储模式。

//代码一
//利用char*指针得到低地址的字节数据
#include<stdio.h>
int main()
{
	int a=1;
	int *pa=&a; 
	//利用char*存储a第一个字节的低地址
	char*pc=(char*)pa;
	printf("%d",*pc);//访问这个字节的地址,打印数据
	return 0;
}

在这里插入图片描述 低地址打印了低字节位,说明bug郭的机器是采用小端存储模式! 我们刚刚是说写个程序,判断字节序,所以我们需要封装一下!

//代码1
#include <stdio.h>
int check_sys()
{
    int i = 1;
    return (*(char *)&i);
}
int main()
{

    int ret = check_sys();
    if(ret == 1)
    {
        printf("小端\n");
    }
    else
    {
        printf("大端\n");
    }
    return 0;
}

我们之前还了解到了一个C语言自定义类型联合体,我们后期还会详细介绍! 联合体就是一块空间,多个变量联合使用,共同占用一块空间!当我们访问其中一个变量,该空间就存储着该变量! 我们可以利用联合体这一特性来判断字节序

//代码2
int check_sys()
{	
	union 
	{
	int i;
	char c;
	}un;
	un.i=1;
	return un.c;
}

在这里插入图片描述 学会了吗,这就是大小端的判断! 在这里插入图片描述