新浪博客

常用数据类型内存存储形式

2016-11-25 08:23阅读:
内容包括常用数据类型(bool、char、int、float、double等)在内存中的存储形式,使用C-Free查看数据在内存中的存储紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易!
目录:
1、bool
2char
3short、int、long
4float(更为详细的转换可参看对(*(volatile unsigned long *)) 的理解
5double
6示例
7、使用C-Free查看数据在内存中的存储

1)源码 2)C-Free图解数据在内存存储情况
--------------------------------------------
常用数据类型在内存在占用的字节数:
类型
大小(字节)
bool
1
char
1
short
2
int
4
long
4
float
4
double
8

-------------------------------------------------------------------------------------------------------
1、bool
通过sizeof(bool)计算得到该类型占用1个字节。
-------------------------------------------------------------------------------------------------------
2、char
char是字符型,占用一个字节,即8位:
1/0
1/0
1/0
1/0
1/0
1/0
1/0
1/0


即有2^8=256个状态,可以表示256个不同的值,只是当有符号和无符号时表示的范围不同,我们平时的所用的每一个字符在内存中都由8位2进制数来表示,比如字符’A’,在ASCLL码中对应十进制65,十六进制的0x41,在内存中为:
0
1
0
0
0
0
0
1


常用数据类型内存存储形式
-------------------------------------------------------------------------------------------------------
3、short、int、long
这三种类型表示整型数每种类型在内存中的长度为2、4、4字节,即16位、32位、32位。当有符号和无符号时每一种表示的范围都有所不同。


在内存中是以补码的形式存在。对于一个整数来说,它的补码就是它的原码本身。对于一个负数来说,它的补码为原码取反再加1。 (注:原码就是这个数本身的二进制形式<整数的反码和补码都和原码相同>,反码是将其原码除符号位外各位求反,补码是在其反码的基础上加1.)
-------------------------------------------------------------------------------------------------------
4、float(更为详细的转换可参看对(*(volatile unsigned long *)) 的理解
float型在内存中有4字节32位,采用IEEE754单精度浮点格式:


如上图所示,该格式最高一位是符号位,0位正,1位负,后面8位为无符号整型数,表示范围为0~255,后面23位小数为,索引从22到0分别对应2^-1到2^-23,则表示的数为


-------------------------------------------------------------------------------------------------------
5、double
double型在内存中有8字节64位,采用IEEE754双精度浮点格式:


如上图所示,该格式最高位也为符号位,0位正,1位负,后面11位为无符号整型数,表示范围为0~2^11-1,后面52位小数为,索引从51到0分别对应2^-1到2^-52,则表示的数为


-------------------------------------------------------------------------------------------------------
6、示例
下面通过几个例子来深化对于这几种类型在内存中存储的理解

  1. char ch = 'A'; // 0100 0001
  2. short s = ch; // 0000 0000 0100 0001
  3. cout << s << endl;

ch是字符型,字符‘A’在内存中为0100 0001,由于s是short型,在内存中占16位,这样复制过来后会将ch复制到s的低8位,则s为0000 0000 0100 0001。
  1. short s = 323; // 0000 0001 0100 0011
  2. char ch = s; // 0100 0011
  3. cout << ch << endl;

在这一段代码中s是short型,在内存中占16位,而ch是字符型只占8位,在将short型复制给char型是不会为了保证接近而将高8位复制过去,而是将short的低8位复制给char,这样的话,在该段代码中s在内存中为0000 0001 0100 0011,则复制后ch为0100 0011 = 67,对应ASCLL码中‘C’,则会输出‘C’。
  1. short s = 2^10 + 2^3 + 2^0;// 0000 0100 0000 1001
  2. int i = s; // 0000 0000 0000 0000 0000 0100 0000 1001
  3. cout << i << endl;

将s复制到i的低16位,如注释所示。
  1. int i = 2^23 + 2^21 + 2^14 + 7; //0000 0000 1010 0000 0100 0000 0000 0111
  2. short s = i; // 0100 0000 0000 0111

我的更多文章

下载客户端阅读体验更佳

APP专享