数据的存储之整形提升

在上篇博客中,我介绍了整形和浮点型的存储方式,在这一篇博客中,将会介绍“整形提升”,什么是“整形提升”呢?这是由于数据在存储中因为数据类型的变化可能导致在内存中开辟的空间位数会发生变化。具体说可能比较抽象,下面我会用两个例子,来比较生动形象的介绍这个整形截断与提升。

#include <stdio.h> 
int main() 
{ 
 char a = -128; 
 printf("%u\n",a); 
 return 0; 
}

在这个很简单的代码中应该打印什么呢?在这里我们逐一的进行分析,首先-128在内存中是按整形存储的,它占四个字节(32位)。而char a则是字符数据类型,在内存中占一个字节(8位),这个时候它代表的是有符号数8位的存储,而打印方式则是无符号整形打印,在这仅仅4行的代码发生了整形的截断与提升,那么这个程序的运行结果是啥呢?是不是-128?答案很明显不是,打印出来的值很大。这是因为-128在给char a中发生了整形截断,而在最终打印过程中进行了整形提升。
结果如下:
首先要说明负数在内存中的存储方式为补码存储,所以-128
原码为
1000 0000 0000 0000 0000 0000 1000 0000
反码为
1111 1111 1111 1111 1111 1111 0111 1111
补码为
1111 1111 1111 1111 1111 1111 1000 0000
在内存中的存储-128占4个字节就是这样的存储。在这时候发生了整形截断,所以a中存储的为
1000 0000
在最后打印的时候是以无符号数打印的,所以会发生整形提升,在这个时候重点来了!!!!!
这时候进行整形提升的时候,是看截断的数据类型是无符号数还是有符号数,若是无符号数直接原码。有符号数取决于当前变量的类型以及最高位是为1还是为0,1000 0000存储是以char类型存储的,这是有符号8位数,所以直接整形提升24个1,最后打印的为
1111 1111 1111 1111 1111 1111 1000 0000
这就是最终结果。
在说一个例子

#include <stdio.h> 
int main() 
{ 
 char a = 128; 
 printf("%u\n",a); 
 return 0; 
}

在这里128在整形截断之后又无符号整形提升打印的应该是什么呢?其实这两个值是一样的。
老样子因为是整数,原码补码都一样,所以在内存中一开始的存储的值为
0000 0000 0000 0000 0000 0000 1000 0000
在整形截断后为
1000 0000,这时候char a依然是有符号数打印,最高位符号位为1,所以整形提升后依旧补
1111 1111 1111 1111 1111 1111 1000 0000
在%u中打印的值直接打印,所以结果的值一样,这只是一点很简单的整形提升的问题,希望能给大家带来帮助。
因为在学校的一些事情,博客好多天没写了,在以后的每天我都会保持更新的,这也是督促我的办法,在后续的博客中我也会发一些很基础的知识与练习题,希望能够帮助大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值