c - 数字末尾有和没有 "u"的宏常量

标签 c integer-promotion type-promotion

用法有什么区别

#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,值为 UINT_MAX .启用额外警告将节省现代编译器的时间(-Wall -Werror 用于 gcc 和 clang)。

256u 的类型为 unsigned int256 的类型为 int。另一个示例更微妙:0xFFFFu 的类型为 unsigned int,而 0xFFFF 的类型为 int int 只有 16 位,它的类型是 unsigned int

一些行业标准(例如 MISRA-C)强制要求不断输入,在我看来这是适得其反的建议。

关于c - 数字末尾有和没有 "u"的宏常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65591933/

相关文章:

c - 将 signed short 存储在 unsigned int 的低 16 位中

关于 C 中无符号类型的说明

c - 隐式转换如何处理有符号字符和无符号整数?

c++ - 如何像内置类型一样提升两个模板类型进行算术运算呢?

c - 为什么我的程序输出内存地址?

c - 使用 X11 的窗口 ID

c - 无锁算法的指针对齐

c - minix 3.1 中的搜索功能

c++ - 在 C++ 中说 "promote everything to floating before calculation"的确定性方式

c - float 变量如何自动提升为 double 类型?