栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录

整形提升的本质:

整形提升的技巧:

案例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 

案例2:
#include
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("%dn",c);
    return 0;
}

总结

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

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

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

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

这里注意一点

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

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

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743944.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号