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

简介: 时光飞逝,想不到已经连续更新了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;
}


相关文章
|
Shell 虚拟化 数据中心
加番 · 自定义vSphere证书
自上个月开始,陆续有客户和粉丝私信:由于vCenter证书过期,出现无法访问控制台的情况。其实这个问题在VMware KB(https://kb.vmware.com/s/article/79248)已经有非常详尽的描述。简单来说,从6.5U2版本以后,vCenter自签名证书有效期只有2年,需要定期更新。
|
Linux iOS开发 开发者
Qt问题(二):无法定位程序输入点于动态链接库
动态链接库(Dynamic Link Library,简称DLL)是一种可执行文件格式,常见于Windows操作系统中,而在Linux和macOS等其他操作系统中,相似的概念通常被称为共享库(Shared Library)。动态链接库允许程序在运行时加载所需的代码和数据,而不是在编译时静态链接到应用程序中。这种方式带来了几个重要的优点:
1969 3
|
10月前
|
机器学习/深度学习 存储 算法
DistilQwen2.5发布:通义千问蒸馏小模型再升级
为解决大语言模型在资源有限环境下的高计算成本和复杂性问题,阿里云推出了基于 Qwen2.5 的轻量化模型系列 DistilQwen2.5。该模型通过双层蒸馏框架、数据优化策略及参数融合技术,在保留性能的同时显著降低计算资源消耗。本文提供了详细的使用教程和代码示例,方便用户在 PAI 平台上调用。
|
安全 UED 开发者
微信扫码登录--设计技术分享
【8月更文挑战第7天】在当今的数字化时代,微信扫码登录已成为众多网站和应用提升用户体验、简化登录流程的重要手段。本文将围绕微信扫码登录的设计原理、实现步骤及关键技术点进行技术分享,帮助开发者更好地理解和应用这一功能。
1124 0
|
编解码 网络协议 C#
wpf下如何实现超低延迟的RTMP或RTSP播放
本文介绍在Windows平台上使用大牛直播SDK的SmartPlayer模块实现在WPF中播放RTMP/RTSP流的方法。通过设置回调函数并选择RGB32格式,可以直接处理视频帧数据进行显示。此外,也可利用PictureBox控件简化视频流的展示。文章提供了示例代码,展示了如何初始化播放器、开始及停止播放,并演示了同时播放两路不同分辨率流的效果及CPU占用情况。SmartPlayer支持多实例播放、多种视频与音频格式、软硬解码、以及丰富的功能特性,适用于多种应用场景。
499 1
|
存储 文件存储 云计算
云计算中的云存储技术对比:技术深度与未来趋势
【7月更文挑战第5天】云计算中的云存储技术多种多样,每种技术都有其独特的优势和应用场景。随着技术的不断发展和应用场景的不断拓展,云存储技术将朝着智能化、自动化、多云/混合云、数据安全与隐私保护以及边缘计算与分布式存储等方向发展。未来,云存储技术将继续为云计算的广泛应用提供坚实支撑。
1158 3
|
前端开发 API 数据库
【Docker专栏】Docker Compose实战:编排多容器应用
【5月更文挑战第7天】Docker Compose是Docker的多容器管理工具,通过YAML文件简化多容器应用部署。它能一键启动、停止服务,保证开发、测试和生产环境的一致性。安装后,创建`docker-compose.yml`文件定义服务,如示例中的web和db服务。使用`docker-compose up -d`启动服务,通过`docker-compose ps`、`stop`、`down`和`logs`命令管理服务。
374 6
【Docker专栏】Docker Compose实战:编排多容器应用
|
人工智能 搜索推荐 决策智能
【AI Agent系列】【阿里AgentScope框架】1. 深入源码:详细解读AgentScope中的智能体定义以及模型配置的流程
【AI Agent系列】【阿里AgentScope框架】1. 深入源码:详细解读AgentScope中的智能体定义以及模型配置的流程
1886 0
|
存储 负载均衡 算法
分布式系列教程(36) -ElasticSearch集群原理
分布式系列教程(36) -ElasticSearch集群原理
339 0