举个例子
我们有下图中的int a = 36;
写出了对应的16进制发现数据在内存中存储的方式跟我们预想的有点不一样
这就是涉及到大小端存储的概念
大端存储:
指的是数据的低位存储到内存的高地址中,数据的高位保存到内存的低地址中。
小端存储:
指的是数据的低位存储到内存的低地址中,数据的高位保存到内存的高地址中。
那我们可以得知在我的机器的Visual Stdio 2019中,十进制数字36对应十六进制0x00 00 00 24 实际上是小端存储的(内存从左往右由低地址到高地址)。
我们知道计算机内存地址单元是以字节为单位的。但是在C语言中,我们有1个字节的char,两个字节的unsigned short int ,四个字节int,八个字节的double等等。再加上不同位数的机器 32,64位的机器,寄存器宽度大于一个字节,那么必然存在着如何安排这么多字节的问题。于是就有了大小端存储
法一:
#include<stdio.h> int Check_sys() { int i = 1;//0x00 00 00 01 char* p = (char*)&i;//我们结合不同指针类型进行加减操作的所往后偏移的字节数不一样 return *p; } int main() { int ret = Check_sys(); if (ret) { printf("小端存储"); } else printf("大端存储"); return 0; }
法二:
#include<stdio.h> int Check_sys() { union { int i; char c; }un;//匿名联合体,因为出函数就销毁所以我们可以使用 un.i = 1; return un.c; } int main() { int ret = Check_sys(); if (ret) { printf("小端存储"); } else printf("大端存储"); return 0; }