c - 数字末尾带和不带“u”的宏常量
问题描述
用法和用法有什么区别
#define CONSTANT_1 (256u)
#define CONSTANT_2 (0XFFFFu)
和
#define CONSTANT_1 (256)
#define CONSTANT_2 (0XFFFF)
我什么时候真的需要添加u
,如果不需要,我们会遇到什么问题?
我对其中一种用法可能与其他用法出错的示例表达式更感兴趣。
解决方案
尾随u
使常量具有无符号类型。对于给出的示例,这可能是不必要的,并且可能会产生令人惊讶的后果:
#include <stdio.h>
#define CONSTANT_1 (256u)
int main() {
if (CONSTANT_1 > -1) {
printf("expected this\n");
} else {
printf("but got this instead!\n");
}
return 0;
}
这个令人惊讶的结果的原因是使用无符号算术执行比较,-1
隐式转换为unsigned int
with value UINT_MAX
。启用额外的警告将节省现代编译器的时间(-Wall -Werror
对于 gcc 和 clang)。
256u
有类型unsigned int
而256
有类型int
。另一个例子更微妙:0xFFFFu
有 type unsigned int
,并且0xFFFF
有 type ,int
除了在int
只有 16 位的系统上有 type unsigned int
。
诸如 MISRA-C 之类的一些行业标准要求这种持续输入,在我看来,这是适得其反的建议。
推荐阅读
- docker - 我可以在 docker 容器中以非 root 用户身份绑定到端口 80。为什么?这是怎么回事?
- reactjs - React cookie 未存储在 Chrome 中,但在 Firefox 中
- typescript - 如何从 tsdoc / typedoc 中正确排除测试文件
- java - 在eclipse中编译java代码时出错
- assembly - 第 n 个斐波那契数,递归 ARM 汇编
- flutter - Flutter:动态底部工作表高度以适应内容
- python - Raspberry Pi 上的 Python OpenCV 检测窗口关闭
- python-3.x - 我应该创建学生的数据库类。我必须创建一个函数来添加课程以增加对象的属性
- html - @Media 样式不适用于 iFrame
- maven - pom.xml 包含 scalatest intellij 未编译