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

内容包括常用数据类型(bool、char、int、float、double等)在内存中的存储形式,使用C-Free查看数据在内存中的存储情况。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易!

目录:

1、bool

2char

3short、int、long

4float

5double

6示例

7、C-Free查看内存中的数据

1)源代码   2)数据在内存中的存储情况

常用数据类型在内存在占用的字节数:

类型

大小(字节)

bool

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,16进制的0x41,在内存中为:

 0 

 1 

 0 

 0 

 0 

 1 

3、short、int、long

这三种类型表示整型数每种类型在内存中的长度为2、4、4字节,即16位、32位、32位。当有符号和无符号时每一种表示的范围都有所不同。

在内存中是以补码的形式存在。对于一个整数来说,它的补码就是它的原码本身。对于一个负数来说,它的补码为原码取反再加1。 (注:原码就是这个数本身的二进制形式<整数的反码和补码都和原码相同>,反码是将其原码除符号位外各位求反,补码是在其反码的基础上加1.)

4、float

更为详细的转换可参看:C语言-(*(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、示例

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

char ch = 'A'; //           0100 0001  
short s = ch;  // 0000 0000 0100 0001  
cout << s << endl;

ch是字符型,字符‘A’在内存中为0100 0001,由于s是short型,在内存中占16位,这样复制过来后会将ch复制到s的低8位,则s为0000 0000 0100 0001。

short s = 323;  // 0000 0001 0100 0011  
char ch = s;    //           0100 0011  
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’。

short s = 2^10 + 2^3 + 2^0;//                     0000 0100 0000 1001  
int i = s;                 // 0000 0000 0000 0000 0000 0100 0000 1001   
cout << i << endl;

将s复制到i的低16位,如注释所示。

int i = 2^23 + 2^21 + 2^14 + 7; //0000 0000 1010 0000 0100 0000 0000 0111
short s = i;                    //                    0100 0000 0000 0111
cout << s << endl;              // s = 2^14 + 7
将int型复制给short型时会将低16位复制过来,如注释所示。
short s = -1;//                     1111 1111 1111 1111  
int i = s;   // 1111 1111 1111 1111 1111 1111 1111 1111  
cout << i << endl;
这个例子中s是负数,负数在计算机中是用补码表示的,short型-1的原码为1000 0000 0000 0001,则补码为1111 1111 1111 1111;

复制给int时为10000 0000 0000 0000 0000 0000 0000 0001,符号位仍在最高位,补码为 1111 1111 1111 1111 1111 1111 1111 1111;

int i = 5;    // 0000 0000 0000 0000 0000 0000 0000 0101  
float f = i;  // 0100 0000 1010 0000 0000 0000 0000 0000  
cout << f << endl;
由于int型和float型的协议不同,这样复制的开销会比较大,虽然两种类型都是32位,因为每次复制都将计算对应的位应该是什么。

5 = 2.5 * 2^1 = 1.25 * 2^2;则符号位为0,无符号整型数为exp = 2 + 127 = 129,0.25 = 2^-2;
所以f在内存中为:0100 0000 1010 0000 0000 0000 0000 0000

int i = 37;           //0000 0000 0000 0000 0000 0000 0010 0101
float f = *(float*)&i;//0000 0000 0000 0000 0000 0000 0010 0101
cout << f << endl;

此时f和i在内存中是完全一致的,因为计算机在计算f是直接通过指针操作,虽然这篇内存区域原来存储的是int型,但由于通过转化为float型指针,计算机就认为该片内存中的内容就是float型的,所以直接将这篇区域中的数直接复制过来。由于37都落在了float型的小数位,所以f会是一个很小很小的浮点数。通过这几个例子应该能够很好的理解各种类型在计算机内存中是如何存储的。

7、C-Free查看内存中的数据

1)源代码

​#include "stdio.h"

void fun(int a[5]);
int main(void)
{
   int b[100]={-2133,2548,'a','c'};
   char CN[100]="汉字";
  
   printf("%x\n",b);
   printf("%x\n",CN);
   fun(b);
   fprintf(stderr,"error:line %d,file %s\n",__LINE__,__FILE__);  
//打印文件中某(些)行错误,说明详见C语言参考手册_哈比森(第5版)之第3章 C预处理器3.3.4 预定义的宏
   return 0;
}

void fun(int a[5])
{
   int i;
  
   i = sizeof(a);
   printf("%x\n",i);
   char c = a[3];
   printf("%x\n",c);
   ;
}

代码的原文件下载请移步:C-Free查看内存中的数据(C代码)

2)数据在内存中的存储情况

(1)“汉字”的存储情况

文字编码查询:查询网站

输入0x60fd20进入地址(A)中,其地址中的数据如下图绿色框所示:ba ba d7 d6

(2)“-2133、2548”的存储情况

输入0x60fd90进入地址(A)中,其地址中的数据如下图绿色框所示:ab f7 ff fff4 09 00 00

(3)字符“a、c”的存储情况

输入0x60fd90进入地址(A)中,其地址中的数据如下图绿色框所示:61 00 00 0063 00 00 00


青春时代是一个短暂的美梦,当你醒来时,它早已消失得无影无踪。觉得不错,动动发财的小手点个赞哦!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱上电路设计

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值