C语言分析数据在内存中的存储一:(整形在内存中的存储)

数据类型介绍

我们知道C语言有很多内置类型:

char     //字符数据类型  1 个字节

short    //短整型        2 个字节

int      //整形          4 个字节

long     //长整形        4 个字节

long long //更长的整形   8 个字节

float    //单精度浮点数  4 个字节

double  //双精度浮点数   8 个字节

 以及他们的存储空间大小。如果把他们归类:

数据归类

 有人会说为什么 char 也是整形家族的,因为字符在内存存储的是ASCLL值,ASCLL值是整形

通常来说 int  一般就是  signed int  有符号的整数,但是 char 没有规定有无符号,但是大部分都是有符号的。(整形家族还有long long 只是没在图上写出来了)

这里都只简单列举了几个,我们重点要说的是整形在内存中的存储

 整形在内存中的存储

我们知道变量是需要在内存中创造空间的,空间的大小根据类型定,所以数据在内存中到底是怎么存储的呢?

原码,反码,补码

之前我们讲过,整形在内存中存储的都是二进制的形式,分为无符号和有符号的整形类型

有符号的最左边的一位是符号位,0是整数,1是负数。无符号的没有符号位全是有效位。

类如:

 有符号的 int 整形 a 在内存中就是 00000000 00000000 00000000 00001010,因为 int 是4个字节,就是32个比特位,图片里是16进值的表现形式而已方便看(二进制变成16进值,4个比特位表示一个16进值位),我们看看负数的:

 负数 b 应该是 10000000 00000000 00000000 00001010啊,为什么是这样的,因为在内存中存储的是补码,而刚刚的是原码,在前面操作符的时候讲过,补码等于原码取反加1,原码取反就是反码(取反符号位不变)。b在内存中应该是 11111111 11111111 11111111 11110110。换成16进值刚刚好。正数的原码,反码,补码都相同。只有负数需要计算。

如果是无符号的是什么样的:

 答案是无符号的存储还是一样的,只是最左边的没有符号位了。

我们看到内存中存储的顺序好像不太一样,这是因为大小端存储模式的原因,后面会讲。

典型列子(解题思路)

有无符号的整形提升与截断:

一:输出什么?

 这里就需要整形提升,答案是:

 分析:-1的原码是 10000000 00000000 00000000 00000001   

补码是 11111111 11111111 11111111 11111111,因为是 char 形,1个字节,要截断为8个位,所以从右边开始截断为 11111111,%d 是打印有符号的,所以先整形提升,整形提升如果是有符号的,补符号位的数字,所以是1,整形提升之后为 11111111 11111111 11111111 11111111,%d打印都当有符号处理,所以负数转为原码,又是取反加1,变为-1。这就是 char a 的分析与 b 是相同的。为什么 c 不一样,因为无符号整形提升是补0的,所以 c 整形提升后是 00000000 00000000 00000000 11111111,打印一看符号位不是1,就是正数了,正数原码,补码都一样,所以是255。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值