C语言基础问题1 数据在内存上的表现形式

来源:互联网 发布:淘宝互刷平台 编辑:程序博客网 时间:2024/06/18 15:44

在我们编写程序的时候输入一下简单程序


运行后,会输出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即可,在这里将不再累述。




0 0
原创粉丝点击