不得不了解的整形提升问题

简介: 时光飞逝,想不到已经连续更新了30天了,嘿嘿,11月满勤了!!!也希望我写的关于C语言的知识对你们有所帮助!感谢大家的支持!


笔者复习C语言,所以笔者将会在掘金每天更新一篇关于C语言的文章! 各位初学C语言的大一新生,以及想要进行C语言回顾的老铁们的不要错过哦! 夯实基础,慢下来就是快!



整型提升是什么

当char和short等小于两个字节的类型变量运算时,会先提升为整形再进行运算



整形提升规则

对于无符号数:补0

对于有符号数:补符号位



题目1:

int main()
{
    char a = -1;
    signed char b = -1;
    unsigned char c = -1;
    printf("a = %d,b = %d,c = %d",a,b,c);
    return 0;
}
复制代码


解析:

%d: 以有符号整数进行打印

a,b,c都为char类型,进行运算时会发生整型提升



内存中存放的是补码,而打印使用的是原码

-1:补码:11111111 11111111 11111111 11111111

由于a,b,c为char类型,会发生截断,从低字节往高字节取8个比特位



a,b为有符号数,整型提升补符号位,即补1

c为无符号数,整形提升补0


  • 先写出原码->内存中的补码
  • 由于是char类型 只能存8个bit  发生截断
  • 进行打印->发生整形提升,
int main()
{
    //-1
    //原码:10000000 00000000 00000000 00000001
    //反码:11111111 11111111 11111111 11111110
    //补码:11111111 11111111 11111111 11111111
    //-------------------------------------------
    char a = -1;
    //a :1111 1111
    //整形提升高位补符号位
    //11111111 11111111 11111111 11111111 ->补码
    //打印的是原码,所以要转化为原码
    //11111111 11111111 11111111 11111111 ->对应原码的值为-1
    signed char b = -1;
    //b :1111 1111
    //整形提升高位补符号位
    //11111111 11111111 11111111 11111111 ->补码
    //打印的是原码,所以要转化为原码
    //11111111 11111111 11111111 11111111 ->对应原码的值为-1
    unsigned char c = -1;
     //c :1111 1111
    //无符号类型,整形提升高位补0
    //00000000 00000000 00000000 11111111 ->补码
    //符号位为0,正数,原码反码补码相同
    //00000000 00000000 00000000 11111111->原码->值为255
    printf("a = %d,b = %d,c = %d",a,b,c);
    // -1 -1 255
    return 0;
}
复制代码


题目2:

int main()
{
    char a = -128;
    printf("%u\n",a);  //4294967168
    return 0;
}
复制代码


解析:

思路:先写出a的原码->得出补码(内存中存放的是补码)

注意:a为char类型,只能存放8位,会发生截断

int main()
{
    char a = -128;
    // -128
    //原码:10000000 00000000 00000000 10000000
    //反码:11111111 11111111 11111111 01111111
    //补码:11111111 11111111 11111111 10000000
    //------------------------------
    //由于a为char类型,只能存放8bit,会发生截断
    //a : 10000000
    //有符号类型 整形提升:补符号位
    //11111111 11111111 11111111 10000000 ->补码
    //%u:以无符号整形打印
    //所以将11111111 11111111 11111111 10000000认为是无符号整形进行打印->符号位不代表正负,对应的值很大
    printf("%u\n",a);  //4294967168
    return 0;
}


相关文章
|
4月前
|
存储
整形和浮点型数据的存储(2)
整形和浮点型数据的存储(2)
36 1
|
4月前
|
编译器 C++
【C/C++】C/C++编程——整型(二)
【C/C++】C/C++编程——整型(二)
54 2
|
4月前
|
存储 编译器 C++
【C/C++】C/C++编程——整型(一)
【C/C++】C/C++编程——整型(一)
47 1
|
4月前
|
编译器 C语言 C++
整形提升和算数转换
整形提升和算数转换
35 0
|
4月前
|
存储
进制转换和整型提升
进制转换和整型提升
|
C语言
整型提升
整型提升
78 0
|
存储 编译器 C语言
数据的存储(整形和浮点型)
数据的存储(整形和浮点型)
83 0
|
C语言
整形提升详解
整形提升详解
133 0
【整型提升问题】
整型提升: 在计算机中,一个数据的类型如果是char 类型,以整型的形式打印该char类型的值时,会自动转换成整型,叫做整型提升。 整型提升的规则: 整型提升是按照变量的数据类型的符号位来提升 举例说明整型提升的存在:
|
存储 程序员 编译器
【浮点型的存储】整型:凭什么你比我特殊?
我们在前一章数据的存储中介绍了除了浮点数类型以外其他类型在内存中的存储,本章将给大家分享浮点数在内存中的存储的详解,希望我的文章能帮到大家.