C语言基础问题1 数据在内存上的表现形式
2015-07-13 18:21
309 查看
在我们编写程序的时候输入一下简单程序
![](https://img-blog.csdn.net/20150713182350900?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
运行后,会输出a的值,也就是1。但是在内存上,a的值又是怎样表示的呢?一下将分为三种情况进行分析说明。
1、正整数
程序如下:
![](https://img-blog.csdn.net/20150713183327854?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
通过gdb指令查看调试信息之后的得到下面的信息:
![](https://img-blog.csdn.net/20150713183448371?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可见a的地址是0xbffff1b8,内容是0x01 0x00 0x00 0x00,根据高高低低的原则可看出a中数据就是1,同理可见b中的数据为0x12345678
也就是说,输入整数之后数据按照高高低低的排列规则进行排列放入相关参数的内存中。
2、负整数
前面说到了输入1的时候内存中会存入1,那么输入-1的时候会是什么情况呢 ?
![](https://img-blog.csdn.net/20150713184041890?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
通过gdb指令查看调试信息之后的得到下面的信息:
![](https://img-blog.csdn.net/20150713184327211?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看出-1输入之后在内存中表现为0xff,而-2表现为0xfe
下面我们来计算-1 和-2的反码和补码:
-1:
原码 1000 0001
反码 1111 1110
补码 11111111
0xff
-2
原码 1000 0010
反码 11111101
补码11111110 0xfe
很明显可以看出-1,-2 的补码与内存中-1,-2的表现形式是一样的。
也就是说,当输入为负整数的时候,在内存中将会以负数补码形式存在。
3、正负小数
这里我们以输入2.5和-2.5为例
![](https://img-blog.csdn.net/20150713192101695?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
通过gdb指令查看调试信息之后的得到下面的信息:
![](https://img-blog.csdn.net/20150713192203314?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
通过百度可以知道:小数输入时内存中的表现形式从高到低依次为符号位->指数位->转换后小数点后的数字
并且单精度和双精度所占的空间是不一样的:这里是单精度,符号位占1位,指数位占8位,转换后小数点后的数字占23 位
但是双精度则是:符号位占1位,指数位占11位,转换后小数点后的数字占52位
接下来开始转化小数
2.5表示为二进制位10.1(0.5的转换是根据乘2取整得到的)
算上符号位即是010.1
再将其转化为01.01*10^1
指数位为127+指数的二进制即是1000
根据前面说到的表现形式可得:
0 1000 0000 0100 0000 0000 0000 0000 000
符号位
指数位 小数
写成标准二进制就是 0100 0000 0010 0000 0000 0000 0000 0000
转换成十六进制便是 0x40 0x20 0x00 0x00
这与截图是一致的
而-2.5仅需将符号位改为1即可,在这里将不再累述。
运行后,会输出a的值,也就是1。但是在内存上,a的值又是怎样表示的呢?一下将分为三种情况进行分析说明。
1、正整数
程序如下:
通过gdb指令查看调试信息之后的得到下面的信息:
可见a的地址是0xbffff1b8,内容是0x01 0x00 0x00 0x00,根据高高低低的原则可看出a中数据就是1,同理可见b中的数据为0x12345678
也就是说,输入整数之后数据按照高高低低的排列规则进行排列放入相关参数的内存中。
2、负整数
前面说到了输入1的时候内存中会存入1,那么输入-1的时候会是什么情况呢 ?
通过gdb指令查看调试信息之后的得到下面的信息:
可以看出-1输入之后在内存中表现为0xff,而-2表现为0xfe
下面我们来计算-1 和-2的反码和补码:
-1:
原码 1000 0001
反码 1111 1110
补码 11111111
0xff
-2
原码 1000 0010
反码 11111101
补码11111110 0xfe
很明显可以看出-1,-2 的补码与内存中-1,-2的表现形式是一样的。
也就是说,当输入为负整数的时候,在内存中将会以负数补码形式存在。
3、正负小数
这里我们以输入2.5和-2.5为例
通过gdb指令查看调试信息之后的得到下面的信息:
通过百度可以知道:小数输入时内存中的表现形式从高到低依次为符号位->指数位->转换后小数点后的数字
并且单精度和双精度所占的空间是不一样的:这里是单精度,符号位占1位,指数位占8位,转换后小数点后的数字占23 位
但是双精度则是:符号位占1位,指数位占11位,转换后小数点后的数字占52位
接下来开始转化小数
2.5表示为二进制位10.1(0.5的转换是根据乘2取整得到的)
算上符号位即是010.1
再将其转化为01.01*10^1
指数位为127+指数的二进制即是1000
根据前面说到的表现形式可得:
0 1000 0000 0100 0000 0000 0000 0000 000
符号位
指数位 小数
写成标准二进制就是 0100 0000 0010 0000 0000 0000 0000 0000
转换成十六进制便是 0x40 0x20 0x00 0x00
这与截图是一致的
而-2.5仅需将符号位改为1即可,在这里将不再累述。
相关文章推荐
- 我是运营,我没有假期
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- 修复mysql数据库
- Lua和C语言的交互详解
- SQLServer 数据导入导出的几种方法小结
- MySQL数据备份之mysqldump的使用详解
- C#实现窗体间传递数据实例
- 给你的数据库文件减肥
- Oracle数据更改后出错的解决方法
- C#将Sql数据保存到Excel文件中的方法
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言内存对齐实例详解
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 探讨C语言的那些小秘密之断言
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置