整型、浮点型在内存中的存储方式

 

在学习C语言的过程中,有时候会想,数据到底是以什么样的方式在内存中存储的呢?经过一段时间的查阅资料,小编终于整理了一些……

以VC6.0编译器为测试环境(int型为4Byte)

先简介一下大小端模式,具体资料可参考

http://blog.csdn.net/ce123_zhouwei/article/details/6971544

 

简介一下:

大端模式:Big-Endian

就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端

小端模式:Little-Endian

就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端

我们常用的x86系列cpu,就是小端模式存储方式的……

一、正整型

正整型,没什么好说的,就是补码存储方式,正数的补码和原码相同,即先转换为二进制,然后高位扩展0,一直填充至32位……

比如:5这个数的存储方式如下

先转换为二进制:101

因为只有3位,所以前面填充29个0,即 00000000 00000000 00000000 00000101

二、负整型

负整型,跟正整型一样,也是补码存储方式,不过负数的补码计算方式是取绝对值的二进制,按位取反再加1

比如:-5这个数

先取绝对值,即5,即 00000000 00000000 00000000 00000101

然后按位取反:11111111 11111111 11111111 11111010

再加1:即 11111111 11111111 11111111 11111011

三、正浮点型

浮点型中有两种,一种是4Byte的float型,一种是8Byte的double型,这两种计算方式都一致,只是有点点区别

1、float型:

float型是遵循IEEE R32.24规范,即1位符号位、8位阶码、23位尾数

具体计算方式是先用科学计数法表示出该数的二进制,然后计算出阶码值,最后把尾数补足23位,依此存储

比如125.5这个数

先看整数部分,125表示成二进制是1111101,(整数转换二进制是除二取余)

再看小数部分,0.5表示成二进制是0.1,(小数转换二进制是乘二取整)

所以125.5用二进制表示就是1111101.1,转换成科学计数法就是1.1111011 x 2^6(阶数为6)

但是这里的阶码是用移码的形式表示,float型的偏置量是127,于是6+127=133,即10000101

这里前面的9位就出来了,因为是正数,所以符号位为0,阶码为10000101

后面的尾数就是1111011,在后面补0,凑齐23位,即 1111011 00000000
00000000(因为科学计数法的整数部分总是为1,所以,这个1不用存储)

所以125.5的存储方式为 0 10000101 11110110000000000000000

即: 01000010 11111011 00000000 00000000

2、double型

double型跟float型计算方式类似,不过区别在于double型遵循IEEE R64.53规范

a、double的符号位是1位,阶码为11位,尾数为52位

b、double的偏置量是1023,而float是127

四、负浮点型

和上面一样,不过就是符号位用1表示,就这点小区别

五、验证方式

有两种验证方式,一种是用联合体的方法、一种是强制类型转换方法

1、联合体法:

可以定义一个联合体,比如

union data

{

    float a;

   char array[4];

};

那么可以对a赋值,然后依次输出数组array的各个元素,这样就可以验证

2、强制类型转换法:

float a;

char *p=(char *)&a;

这样,将a的地址强制转换为指向字符类型之后,赋值给指针p,后续再依次输出*p、*(p+1)、*(p+2)、*(p+3)的值,也可以进行验证

参考资料:http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html

 

原创文章,作者:会飞的猪,如若转载,请注明出处:http://www.178linux.com/11037

(1)
会飞的猪会飞的猪
上一篇 2016-01-14
下一篇 2016-01-14

相关推荐

  • 马哥网络教育班第21期+第七周课程练习

    1、创建一个10G分区,并格式为ext4文件系统; (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl; (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; [root@localhost ~]# fdisk /dev/sd…

    Linux干货 2016-08-12
  • 磁盘管理

    设备类型分为字符设备和块设备 主设备号用来标识设备类型,次设备号标识同一类型下的不同设备 硬盘设备命名: scsi,sata,sas,usb:/dev/sd 不同设备/dev/sda  /dev/sdb 同一设备不同分区:/dev/sda1,/dev/sdb2…… 硬盘: 一片磁盘的一面叫做盘面,一张盘片有两个盘面 每个盘面有一个磁头,最多有256…

    Linux干货 2016-08-30
  • 没有自动ip解决办法

    用虚拟机下载好centos6.9后,本来想查看ip地址,结果发现没有自动获取ip地址,在网上找了很多方法都不行,问题如下: 用命令ifconfig查看ip地址,发现没有,如下 查看eth0如下 解决办法如下: 1、关闭NetworkManager服务 2、关闭NetworkManager开机启动 3、添加 /etc/sysconfig/network-scr…

    2017-07-16
  • 网络管理

    7层结构。三次握手,四次挥手。

    2017-12-17
  • HA专题: 使用pacemaker+corosync实现MySQL高可用

    HA专题: 使用pacemaker+corosync实现MySQL高可用 前言 实验拓扑 实验环境 实验步骤 准备工作 安装HA组件并配置 配置NFS 配置MySQL 配置HA资源 测试 总结 前言 上篇文章我们介绍了使用pacemkaer+corosync实现简单的nginx高可用, 这篇文章我们介绍如何使用pacemaker+corosync实现MySQ…

    Linux干货 2016-04-11
  • 系统启动及内核管理

    一、知识整理 1、nohup 命令:不挂断地运行命令,远程连接当断网或断开shell时还可以继续运行。无论是否将nohup命令的输出重定向到终端,输出都将附加到当前目录下的nohup.out文件中,如果当前不可写,则重定向到家目录nohup.out文件,除非定义了输出文件。 nohup COMMAND 输出重定向至文件 nohup COMMAND &…

    Linux干货 2016-09-19