定义短的魔术数字时小心负数的整型提升
背景
看这段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
总结
- 魔术数字一般是字母打头,如果不是
int
而是short
或char
这种短整型,要考虑负数的影响 整型提升
是C语言隐式类型转换
的一种,更多请看该链接- 既然都想好用魔术数字了,那类型就不要用有符号整型,改用无符号整型就能避免本文所做的强制类型转换😂