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所以就先不对这种放大进行介绍了,等哪天搞清楚了再给大家介绍。
那我们来具体的看一下,整型数据在内存中是如何储存的
先在监视中添加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所以就先不对这种放大进行介绍了,等哪天搞清楚了再给大家介绍。
相关文章推荐
- 一个简单程序思考计算机里int数据的存储问题,兼论大端模式和小端模式
- MySql 中int 数据类型 存储长度 与显示长度
- Linux基本数据类型大小——int,char,long int,long long int(/usr/include/limit.h文件对Linux下数据类型的限制及存储字节大小的说明)
- int_float_double数据类型的存储格式。
- 细谈数据类型以及计算机存储数据机制(一)
- 读书笔记:MySQL数据库 数据类型优化二 用整形Int 存储 IP地址
- 关于int类型数据在内存中的高低位存储问题
- 关于int类型数据在内存中的高低位存储问题
- hibernate 存储int 类型的数据出错
- 存储过程,从数据类型 nvarchar 转换为 int 时出错
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式
- 计算机存储单位与Java数据类型
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式
- C学习笔记2-int类型数据在内存中的存储形式
- SQL Server 2005 int与datetime数据类型的存储结构说明
- 关于计算机中数据类型存储的对齐问题
- 以C程序角度探究计算机里int 类型的存储与最大数最小数,为什么负数补码存储
- 佩特来项目经验小集合(2)___组合查询存储过程,报错 "varchar JBID='' 转换成数据类型 int 时失败"
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式
- 定义一个不受计算机字长限制的整数类INT,要求INT与INT以及INT与C++基本数据类型int之间能进行+、-、×、÷和=运算,并且能通过cout输出INT类型的值。(持续添加)