当前位置: 首页 > 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.lryc.cn/news/617269.html

相关文章:

  • Mybatis @Param参数传递说明
  • 三种常见的菜单路由封装方式详解
  • 邬贺铨院士:AI与数字安全融合是数字化建设核心驱动力
  • 算法73. 矩阵置零
  • Dubbo从入门到实战:分布式服务开发指南
  • React18 Transition特性详解
  • Apache IoTDB 全场景部署:跨「端-边-云」的时序数据库 DB+AI 实战
  • 智能制造算力一体机:工业 4.0 时代的算力基建革命
  • WPF之绑定!
  • 源码分析Eino框架工具调用--创建篇
  • 瑞芯微rk3588:yolov8-obb训练实战笔记
  • 云原生环境 Prometheus 企业级监控实战
  • 容器 K8S Docker Kata 学习(一)
  • k8s的calico是什么作用,举例一下
  • 【软考中级网络工程师】知识点之 UDP 协议:网络通信中的高效轻骑兵
  • k8s PV和PVC开始总结
  • AI时代基于云原生的 CI/CD 基础设施 Tekton
  • RabbitMQ 声明队列和交换机详解
  • HTTPS 协议原理 ——4种方案
  • HTTPS的应用层协议
  • 2024年ESWA SCI1区TOP,自适应种群分配和变异选择差分进化算法iDE-APAMS,深度解析+性能实测
  • 在 ASP.NET 项目中用 C# 生成二维码
  • 为 Promethus 配置https访问
  • 无人机航拍数据集|第12期 无人机停车场车辆计数目标检测YOLO数据集1568张yolov11/yolov8/yolov5可训练
  • FP32、BF16、FP16三种方式比较
  • 计算机视觉CS231n学习(7)
  • 《范仲淹传》读书笔记与摘要
  • MySQL数据库简介
  • MySQL-日志
  • Vue 3 快速入门 第六章