关于char与short类型的整形提升,以及使用和打印时原反补的转换

本文详细介绍了整形提升的本质,即在运算前将char或short类型转换为int。讲解了无符号数和有符号数的提升规则,并通过实例展示了数据如何在内存中存储和转换。在案例中,解释了数据截断、补码运算和打印过程,揭示了整形提升的完整步骤。总结了提升过程的关键点,包括数据转换、截断和打印时的注意事项。
摘要由CSDN通过智能技术生成

目录

整形提升的本质:

整形提升的技巧:

案例1:

案例2:

总结


整形提升的本质:

char或者short类型的操作数在使用之前,要被转换成普通int整形,称为整形提升(小于整形大小的采用整形提升)

整形提升的技巧:

1.无符号数:直接补0,直至补到32bit位

2.有符号数:补符号位,直至补到32bit位

那么这里是如何判断,一个数据存入后,是有符号数,还是无符号数呢?

根据类型来判断!

signed char/short 为有符号类型

unsigned char/short 为无符号类型

对于计算机而言,存入的数据,都是以32位二进制位进行存入,没有正负之分,所以我们规定最高位为符号位,1为负,0为正

小练习:

unsigned char c = -1

那么c是有符号数还是无符号数呢?

虽然存入的是-1,但是这是unsigned char类型,

也就是说这是一个无符号类型,我们就要把-1看作无符号数

这样在整形提升中,我们前面就要全补0!!!

这里稍微提示一下:

char类型,有可能是signed char 也有可能是unsigned char

在大部分编译器下 char类型默认为signed char

接下来,我们直接用两个案例来学习。

我们先看两个案例,然后进行一个总结。

这里以char类型举例,short类型同理

案例1:

#include<stdioh
int main()
{
    char c1 = 3;
    //0000 0000 0000 0000 0000 0000 0000 0011(补码)
    //c1只能放8个bit
    //0000 0011 - c1
    char c2 = 127;
    //0000 0000 0000 0000 0000 0000 0111 1111(补码)
    //c2只能放8个bit
    //0111 1111 - c2
    char c3 = c1+c2;
    //整形提升
    //最高位补充符号位,之前所有位都补符号位的值
    //0000 0000 0000 0000 0000 0000 0000 0011 - c1提升之后
    //0000 0000 0000 0000 0000 0000 0111 1111 - c2提升之后
    //0000 0000 0000 0000 0000 0000 1000 0010(补码)
    //c3只能放8bit
    //1000 0010 - c3
    //整形提升
    //1111 1111 1111 1111 1111 1111 1000 0010(补码)
    //1111 1111 1111 1111 1111 1111 1000 0001(反码)
    //1000 0000 0000 0000 0000 0000 0111 1110(原码)
    //结果 -126
    printf("%d",c3)
    return 0;
}

案例2:

#include<stdio.h>
int main()
{
    unsigned char c = -1;
    
    //我们先进行数据的存入,这里存入是根据数据的正负有关,与unsigned和signed无关
    //1000 0000 0000 0000 0000 0000 0000 0001(原码)
    //1111 1111 1111 1111 1111 1111 1111 1110(反码)
    //1111 1111 1111 1111 1111 1111 1111 1111(补码)
    
    //由于char类型只有1个字节,1Byte=8bit,所以原来的32bit位将发生截断!
    //1111 1111

    //在最终打印的时候,我们要对之前截断后的所剩下的8bit位 整形提升!!
    //0000 0000 0000 0000 0000 0000 1111 1111
    
    //以%d形式进行打印,也就是说打印有符号数,
    //根据最高位是0,也就是符号位是0,也就是正数,正数的原反补相同,直接打印即可

    //最终输出结果
    //0000 0000 0000 0000 0000 0000 1111 1111
    //255

    printf("%d\n",c);
    return 0;
}

总结

以上,我们可以总结出一个简单的char/short类型在使用时的整形提升的步骤:

1.将数据以32bit位存入,然后将其转变为补码

2.数据截断,char类型截断为8bit位,short类型截断为16bit位

3.使用时,将数据整形提升,无符号数补0,有符号数补符号位

这里注意一点

前三步,都是将数据以补码的形式进行操作的

4.使用时将其转变为原码,有符号类型 补码按位取反得到反码,原码+1得到原码

5.如果是打印的话,看是以%d形式打印还是以%u形式打印

以%d形式打印:考虑是否进行原反补的转换

以%u形式打印:直接打印补码,因为无符号数原反补相同

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值