各位帅哥靓女们,我是猪猪,别问我这么多天不跟新在干啥,问就是在准备期末考试,今天我们讨论的则是计算机中一个比较深层次的问题,计算机的大小端问题。老规矩觉得猪猪说的地方有啥有问题的地方,还请评论区斧正,如果觉得猪猪写的还可以,还请一键三连。
【一】什么是大小端:
大端运行模式,是指数据的低位保存在内存的高地址,而数据的高位保存在内存的低地址中;
小端运行模式:是指数据的高位保持在内存的高地址,而数据的高位保存在内存的低地址中;
有的小伙伴就要问了,啥是高地址啥是低地址,地址这个概念请看猪猪的宁一篇文章,浅析指针,里面会涉及地址的问题,至于高低地址的问题,这里你就理解为房门号的大小即可,后面猪猪会写一篇博客关于函数的栈帧,这里面我会细说函数的低地址和高地址的问题。
【二】为啥会有大小端:这个问题很多小伙伴都是非常想知道的,但是同学你要知道一个数据最小是char的类型是一个字节,而字节下面是八个比特位,最大的为long long类型八个字节,64个比特位,既然占据了这么长的空间存储一个数据,那么你首先就要考虑一个问题,我首先去填充哪个空间。就比如你带着你爸妈和你弟弟出去旅游晚上开宾馆,你预定了四个房间,这四个房间就是一个整型,你和你的父母和弟弟就是四个字节,你们一家人就是一个整型,你想用一个整型存放这个数据就和这四个房间去存放你们一家人一样,首先假设你们一家人的安排顺寻是妈妈,爸爸,你,弟弟,那么最大的问题就来了,是从门牌号小的开始安排,还是从门牌号大的开始排?虽然最后的结果是你们一家人住进去了都一样,但是怎么住也是一个很重要的问题不是吗?
所以针对这个问题,工程师设计出了两种存储的方式,既大端和小端,即从地址大的开始排,或者是从地址小的开始排。
【三】常见的大小端的架构:
小端;x86,很多的ARM,DSP
大端:KEIL C51
有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
事实上大部分的大小端都是由硬件决定的
通过下面一段代码即可检验出你的程序的大小端问题:
#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; }
这是为啥呢?
首先int类型的1存储时的补码为:00000000 00000000 00000000 00000001
这是一个int类型的数据,你使用char指针访问只能访问一个字节的地址,这个地址还是这个数据刚开始的地址,那么,你只有char类型的指针只有两种访问的可能:第一种是00000000,第二种是0000001,如果是第第一种就是低地址位置存放高值位置,就是大端存储,如果是第一种就是低地址存放低值位,就是小端。
以上就是猪猪这期的内容了,以上所有的内容只在面试的时候有用,写代码的时候我目前还没用到他的地方,好啦,这就是这期猪猪要说的问题,如果诸位看官觉得还可以,请给猪猪一键三连,毕竟码字不易。感谢给位看官,由耐心看到这里。