首页 > 解决方案 > 数字末尾带和不带“u”的宏常量

问题描述

用法和用法有什么区别

#define CONSTANT_1 (256u)
#define CONSTANT_2 (0XFFFFu)

#define CONSTANT_1 (256)
#define CONSTANT_2 (0XFFFF)

我什么时候真的需要添加u,如果不需要,我们会遇到什么问题?

我对其中一种用法可能与其他用法出错的示例表达式更感兴趣。

标签: cinteger-promotiontype-promotion

解决方案


尾随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 intwith value UINT_MAX。启用额外的警告将节省现代编译器的时间(-Wall -Werror对于 gcc 和 clang)。

256u有类型unsigned int256有类型int。另一个例子更微妙:0xFFFFu有 type unsigned int,并且0xFFFF有 type ,int除了在int只有 16 位的系统上有 type unsigned int

诸如 MISRA-C 之类的一些行业标准要求这种持续输入,在我看来,这是适得其反的建议。


推荐阅读