一、什么是大小端?
其实超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:
大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容保存在内存的低地址处。
小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容保存在内存的高地址处。
当我们了解了整数在内存中存储后,我们调试看一个细节:
#include <stdio.h>
int main()
{
int a = 0x11223344;
return 0;
}
调试的时候,我们可以看到在a中的 0x11223344 这个数字是按照字节为单位,倒着存储的。这意味着在该编译器中数据是按照小端模式存储的。
二、为什么有大小端?
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit 位,但是在C语言中除了8 bit 的 char 之外,还有16 bit 的 short 型,32 bit 的 long 型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么0x11 为高字节, 0x22 为低字节。
对于大端模式,就将 0x11 放在低地址 0x0010 中,0x22 放在高地址 0x0011 中。小端模式,刚好相反。
三、请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序
//请简述⼤端字节序和⼩端字节序的概念,设计⼀个⼩程序来判断当前机器的字节序。
#include <stdio.h>
int check_sys()
{
int a = 1;
return (*(char*)&a);
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("small end\n");
else
printf("big end\n");
return 0;
}