拿捏大小端:
哈喽嗷,铁汁们,今天咱们一起把大小端拿捏了嗷。
看完今天这帖子,以后有人问你啥是大小端,怎么判断?你只需要微微摇头,然后啪的一下在他电脑上敲出:
int a = 1;
然后轻轻告诉他,就是这样判断。(记得表情一定要展示出自信嗷,自信的味道~)
我知道,有铁汁看到这马上就不同意了,一行代码还想判断大小端。啪的一下就站起来了,说:
楼主你放屁!更有甚者直呼楼主大傻*(大可爱)。
对于这些铁汁,我只想说,三十年河东,三十年河西,莫欺。。。咳,扯远了,我想说的是咱们往下看就知道了(滑稽)
长篇大论的大小端介绍咱们就晚点搞了,直接进入主题嗷:
目录
数字1的补码:
首先这有个数字1:
这个数字1的补码有了。为方便描述,我们以16进制表示1的补码嗷。
内存空间:
现在这有个内存空间:
问题来了嗷铁汁们,怎么把1的补码放进去?
放进去之前先告诉铁汁们嗷:对于一个数字,存在高位和低位。
一般情况下:左边为高位,右边为低位
比如:
知道了高位和低位,那么铁汁们看看下面两种把1的补码放在内存中的情况。
将补码放进内存空间中的两种方法:
现在把补码放进去:
放法1:
铁汁们,像这种把内存中低地址保存数据的高位
而内存中高地址保存数据的低位
这种存储模式就叫大端存储模式
放法2:
铁汁们,像这种把内存中低地址保存数据的低位
而内存中高地址保存数据的高位
这种存储模式就叫小端存储模式
我知道嗷,有铁汁看到这啪的一下就。。。
你先等等嗷,的确不难嗷,就怕你记混了(滑稽)
记忆方法:
在这楼主给出一个方法,就是:只看低地址
低地址保存低位-------------小端存储模式
低地址保存高位-------------大端存储模式
如何判断CPU是大端还是小端:
铁汁们,这个问题能否解决,怎么解决。我在这告诉大家很好解决嗷。简简单单拿捏。
给大家表演个绝活嗷。(前方高能,高难度代码即将展示)
int a=1;
好了,我写完了。
我知道铁汁们此时的心情莫不是:
铁汁们不要急,我没有糊弄你们嗷。的确写完了。接下来咱们只需要通过咱们的编译器,进入内存窗口查看一下a的地址的存放情况就行了。
楼主以自己电脑+VS2019编译器展示结果如下:
铁汁们如图嗷,存放的是OX 01 00 00 00(编译器为了观看方便使用16进制打印出来,但实际内存中存储的是2进制形式)
其中 低地址存放的是01(低位),所以判断为:小端存储模式
真正的判断方法:
其实还有一种方法:
#include<stdio.h>
int main()
{
int a=1;
char *p=(char*)&a;
if(*p==1)
printf("铁汁你的CPU为小端存储模式");
else
printf("铁汁你的CPU为大端存储模式");
return 0;
}
铁汁嗷,将a的地址强制转换为 char* 并保存在字符指针p中后,对p解引用就只能访问一个字节了。正好可以访问地址中第一个字节到底是 01(小端存储模式)
还是 00 (大端存储模式)
如此操作,就可以判断自己的CPU的存储模式了嗷。(在这楼主查了一下,大小端存储模式主要由CPU决定嗷,与操作系统,编译器无直接关系。咱们平常使用的inter、AMD处理器是小端存储,也不知道有没有新推出大端处理器(滑稽))
封装一个判断大小端的函数:
其实咱们还可以将这段代码转化为函数,封装后保存在头文件中以后就可以自己调用自己编写的大小端函数了嗷。
int DX()
{
int a=1;
char *p=(char*)&a;
if(*p==1)
return 1;
else
return 0;
}
返回1表示为小端存储模式,返回0表示为大端存储模式。
简化一下:
当然可以简化一下嗷:
int DX()
{
int a=1;
return *(char*)&a;
}
现在铁汁们咱们是不是就把大小端拿捏了嗷。
如果就这样想还是too yang too simple
接下来给出一系列关于大小端的介绍,原谅我把他们放在最后。
大小端介绍:
什么是大端小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
为什么有大端和小端:为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在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 中。小端模式,刚好相反。我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。(在这感谢B站鹏哥给的资料嗷,嘿嘿嘿。)
重回开头:
铁汁们,至此,咱们今天把大小端拿捏了嗷,以后有人问你啥是大小端,怎么判断?你只需要微微摇头,然后啪的一下在他电脑上敲出:
int a = 1;
然后告诉他,就这么简单。(这次表情可以更加自信了,毕竟你已经会了嗷铁汁)
被打屎别说我说的嗷。
--------------------------------------------------------------------分割线----------------------------------------------------
记编程的第32天
记来到CSDN的第17天