int类型数据在计算机中的存储
来源:互联网 发布:mp3合并软件手机软件 编辑:程序博客网 时间:2024/05/18 05:03
首先在这里给大家先介绍一下原码、反码、补码。最早刚开始学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("小端存储");elseprintf("大端存储");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("小端存储");elseprintf("大端存储");return 0;}
return (*(char*)&i)这里的意思将你的整型数据i取地址之后将整型强转成char类型来进行访问因为int类型是32位但是char类型只有8位所以如果你的机器是小端存储的话你转化成char类型之后依然是1,但是如果你用大端存储的话转化之后你的1就丢失了。所以这种办法也能判断是大端存储还是小端存储。
网上看到一句话,咱们用的机器大多都是小端存储如果你面试的时候编写程序出现了大端存储的情况就要好好检查一下,但是也不排除真的是大端存储的情况。
网上还有一个union的方法,没有过多的了解过union所以就先不对这种放大进行介绍了,等哪天搞清楚了再给大家介绍。
- int类型数据在计算机中的存储
- Short类型在计算机中的存储
- 数据在计算机内存中的存储
- 浮点数据在计算机中的存储方式
- 数据在计算机中的存储方式
- 【C++】内置类型 在计算机存储中的表示
- float数据在计算机内存中的存储方法
- 4、数据在计算机中的存储形式和运算
- 数据在计算机中的存储形式和运算
- float和double数据在计算机中的存储方式
- 数据在计算机中的存储形式和运算
- 数据在计算机中的存储形式和运算
- 数据在计算机中的存储(字节序,浮点数)
- float数据在计算机内存中的存储方法
- float数据在计算机内存中的存储方法
- 数据在计算机中的存储形式和运算
- 数据在计算机中的存储形式和运算
- 数据在计算机中的存储形式和运算
- 看完让你彻底搞懂Websocket原理
- java hppt ClientProtocolException invalid http response
- 八(n)皇后
- svg模糊图片局部清晰透视图
- Linux下ArcGIS Runtime for Qt 100.1的安装和运行
- int类型数据在计算机中的存储
- 3种方法求解斐波那契数列
- ubuntu 23.0.1/aidl
- Webmagic网络爬虫(JAVA)
- keytool 用法总结
- Java对变量的初始化问题
- 使用FactoryBean自定义实例化逻辑
- 给Python加速(性能加速的方法)
- zsh下调用sublime mac