当前位置: 首页 > news >正文

定义短的魔术数字时小心负数的整型提升

背景

看这段C代码,会输出什么?

#include <stdio.h>int main()
{short magic = 0xcafe;if (magic == 0xcafe)printf("valid magic\n");elseprintf("invalid magic\n");return 0;
}

输出

invalid magic

原因分析

这是因为C语言的整型提升,导致关系运算符==左边的magic(类型是short)被提升成0xffffcafe,然后==右边的0xcafe被提升为0x0000cafe,最后一比较就得出不相等的结论。

有人问为啥==右边的0xcafe不会被提升为0xffffcafe呢?这是因为0x前缀的短整数默认转成无符号的长整数。

解决

告诉编译器类型,编译器就能正确比较了

#include <stdio.h>int main()
{short magic = 0xcafe;if (magic == (short)0xcafe)printf("valid magic\n");elseprintf("invalid magic\n");return 0;
}

输出

valid magic

总结

  1. 魔术数字一般是字母打头,如果不是int而是shortchar这种短整型,要考虑负数的影响
  2. 整型提升是C语言隐式类型转换的一种,更多请看该链接
  3. 既然都想好用魔术数字了,那类型就不要用有符号整型,改用无符号整型就能避免本文所做的强制类型转换😂
http://www.dtcms.com/a/326661.html

相关文章:

  • AIStarter修复macOS 15兼容问题:跨平台AI项目管理新体验
  • 【51单片机数码管循环显示3位数字】2022-10-26
  • Spring Boot文件上传功能实现详解
  • day25-IO
  • gateway进行接口日志打印
  • 刘强东的AI棋局
  • 高并发内存池 内存释放回收(6)
  • 如何生成测试报告
  • 加载模型使用torch_dtype参数来显式指定数据类型
  • 美股期权历史波动率数据研究分析教程
  • 基于STM32单片机超声波测速测距防撞报警设计
  • c# 线程的基础教学(winform 电梯模拟)
  • C9800 ISSU升级
  • 【Java工具】Java-sftp线程池上传
  • ADK[5]调用外部工具流程
  • (附源码)基于Spring Boot的4S店信息管理系统 的设计与实现
  • 每日算法刷题Day61:8.11:leetcode 堆11道题,用时2h30min
  • 【功能测试】软件集成测试思路策略与经验总结
  • HTML应用指南:利用GET请求获取全国vivo体验店门店位置信息
  • 字节后端面经
  • 内网依赖管理新思路:Nexus与CPolar的协同实践
  • Linux-FTP服务器搭建
  • 【图像算法 - 12】OpenCV-Python 入门指南:图像视频处理与可视化(代码实战 + 视频教程 + 人脸识别项目讲解)
  • DHCP服务配置与管理实战指南
  • CRMEB多商户系统(Java)v2.0更新预告:区域管理+预约商品,激活本地商业新活力!
  • NTC热敏电阻、压敏电阻和保险丝工作原理
  • FFmpeg - 基本 API大全(视频编解码相关的)
  • python每日一题练习 两个数组的交集 非常简单
  • GCN: 图卷积网络,概念以及代码实现
  • 【LeetCode刷题集】--排序(三)