您的位置:首页 > 理论基础

int类型数据在计算机中的存储

2017-12-18 17:43 260 查看
  首先在这里给大家先介绍一下原码、反码、补码。最早刚开始学c语言的时候,就是介绍原反补这三种码,当时感觉为什么要就弄这么复杂的三种码,但是最近了解到了一些计算机内部二进制的运算之后,感觉自己能够理解了一些。先简单的说一下这三种都是什么,原码就是将你的十进制数字转换成一个32位二进制数之后的数字序列,反码就是在原码的基础之上,符号位不变其他为进行取反,取反就是如果原码是1那么反码就是0如果原码是0反码就是1,补码就是将你得到的反码进行加1,之后得到的序列就是你的补码。在计算机中所有的整型数据都是用补码来进行存储的,这样大大方便了整型数据的计算。原因在于使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理(CPU中只有加法电路)并且,补码与原码的相互转换,运算过程其实是相同的,不会再需要额外的硬件电路。

  那我们来具体的看一下,整型数据在内存中是如何储存的

 


 

 先在监视中添加a然后获取a的地址之后去内存下看看a的地址存的是什么

 


这里a存的是14 00 00 00

 


 

之后用同样的方法获得b内存储的地址

 

大家先想一下 如果20变成32位之后是什么

原码:0000 0000 0000 0000 0000 0000 0001 0100

反码:0000 0000 0000 0000 0000 0000 0001 0100

补码:0000 0000 0000 0000 0000 0000 0001 0100

因为20是一个正数所以他在内存中的原码、反码、补码是相同的 在内存显示中四个二进制变成了一个数字,这列数字就变成了00 00 00 14但是你发现这里显示的和你求出出来的正好反了过来,我们再看看负数的是什么样。

 

-10的三种码

原码:1000 0000 0000 0000 0000 0000 0000 1010

反码:1111 1111 1111 1111 1111 1111 1111 0101

补码:1111 1111 1111 1111 1111 1111 1111 1010

 

因为四个二进制位最大的是全是1的情况他如果用十进制显示出来就是1+2+4+8=15
不能用一个十进制数显示出来,那就得用十六进制,所以1111
在内存中是f
所以-10
的应该是    ff ff ff fe  但是观察你得出来的结果,同样也是将你的结果反了过来,那这是为什么呢?

 

  这就要对一个新概念进行介绍那就是大小端:大端存储模式,是指数据的低位保存在内存的高地址之中,而数据的高位保存在内存的低地址之中,小端的存储模式自然就是,数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

  那为什么会有着大小端模式之分呢?这是因为在计算机系统中,我们以字节为单位,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言汇总除了8bit的char之外还有16bit的shor型,还有32bit的long型,由于寄存器的宽度大一一个字节,那么必然存在着一个如果将多个字节安排的问题,因此就导致了大端存储和小端存储模式。其实在我看来就是工程师们的意见没有达成统一所以出现了不同的存储方式。并没有什么实际上的差异吧。

  在2015年的百度的系统工程师的面试题中曾经有一道题,请简述大小端字序的概念,并编写一个小程序来验证机器是大端存储还是小端。

 

int main()
{
int i = 1;
int ret = i >> 8;
if (ret== 0)
printf("小端存储");
else
printf("大端存储");
return 0;
}

 这是我所编写的一个程序,如果1是小端存储的话那么0000 0001
这最后一个1就在低地址位,在右移的时候就会丢失,那么补全0之后得出来的数字就是0.如果要是大端存储的话1000
0000  这个1就在最前边,如果你右移8位的时候就不会丢失这个1,得出来就不是1。所以能判段是大端还是小端。

 #include<stdio.h>

int check()

{

int i = 1;

return (*(char*)&i);

}

int main()

{

int ret = check();

if (ret == 1)

printf("小端存储");

else

printf("大端存储");

return 0;

}

return (*(char*)&i)这里的意思将你的整型数据i取地址之后将整型强转成char类型来进行访问因为int类型是32位但是char类型只有8位所以如果你的机器是小端存储的话你转化成char类型之后依然是1,但是如果你用大端存储的话转化之后你的1就丢失了。所以这种办法也能判断是大端存储还是小端存储。

  网上看到一句话,咱们用的机器大多都是小端存储如果你面试的时候编写程序出现了大端存储的情况就要好好检查一下,但是也不排除真的是大端存储的情况。

网上还有一个union的方法,没有过多的了解过union所以就先不对这种放大进行介绍了,等哪天搞清楚了再给大家介绍。

 


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储 c语言 数据
相关文章推荐