C语言——整型的截断与提升

在C中有各样的数据类型,当不同的数据类型放在一起进行处理时,总会有一个“标准”来要求不同的数据进行相同的处理从而完成任务,本文主要分享C中的一种法则:截断与提升,我们举个栗子:

#include<stdio.h>
{
    char a = 3;
    char b = 127;
    char c = a + b;
    printf("%d\n",c);
    //打印出的结果为-126
    return 0;
}

我们可以看到:

对于字符型数据a、b、c我们以整型的格式进行打印,打印出来的数字并不是127+3 = 130,而是-126这个看似很突兀的数,固然我们可以用char类型数据存储范围最大为128,130溢出了来理解,但是显然这并不严谨,所以我们接下来介绍正确的理解方式:

首先对于一个正数来说,计算机存储的是该数字的原码(正数原码、反码、补码都相同)所以:

a —— 00000011

b —— 01111111

c = a + b,这里我们必须知道:

·在表达式计算时,各种整型会一律转化为int类型,称整型提升。(int类型数据不够用时提升为unsigned int)

·整型提升原则:按照符号位将不足的位补足。

所以在运算c = a + b时,会发生如下事情:

a —— 00000011 进行整型提升(符号位为0):

00000000 00000000 00000000 00000011

b —— 00111111 进行整型提升(符号位为0):

00000000 00000000 00000000 01111111

接下来直接进行直接运算:

00000000 00000000 00000000 10000010 该段数据即为c

我们知道c是一个char类型,而char类型的数据只有一个字节(8位),而整型提升得到的c有4个字节(32位),所以我们必须再进行处理,将该int数据“强行塞入”char内,称为“截断

·截断:在原数据末尾开始直接按照所需数据大小拿走所需数据

00000000 00000000 00000000 10000010

以上4个字节中,我们只需要1个字节大小就够,所以我们取走最后8位(一个字节),得到:

10000010 - 该数据即为c

接下来我们以整形的形式进行打印,那么问题又会出现:

char类型怎样以int型输出呢?

答案很简单:进行整型提升。将该类型提升为整形即可。

10000010 符号位为1,所以提升后为:

11111111 11111111 11111111 10000010

这里我们需要注意:该数据第一位(符号位)为1,所以是负数,负数在计算机中存储的是补码,所以我们还要进行还原:

11111111 11111111 11111111 10000010 -补码

11111111 11111111 11111111 10000001 -反码

10000000 00000000 00000000 01111110 -原码

该大小即为-126。

到这里我们就介绍完了整形提升与截断的相关概念。

~~~~点赞加关注,学C不迷路~~~~~~~~

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值