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 thisn");
} else {
printf("but got this instead!n");
}
return 0;
}

这个令人惊讶的结果的原因是比较是使用无符号算术执行的,-1隐式转换为值为UINT_MAXunsigned int。启用额外的警告将节省现代编译器的一天(-Wall -Werrorgcc 和 clang )。

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

一些行业标准,如MISRA-C,要求这种不断打字,在我看来,这是一个适得其反的建议。

u表示十进制常量为unsigned

如果没有它,因为该值适合有符号整数的范围,所以它将被当作有符号整数。

引用C11,第 6.4.4.1 章,整数常量

The type of an integer constant is the first of the corresponding list in which 
its value can be represented.
Suffix    Decimal Constant            Octal or Hexadecimal Constant
---------------------------------------------------------------------------
none      int                         int
long int                    unsigned int
long long int               long int
unsigned long int
long long int
unsigned long long int

u or U    unsigned int                unsigned int
unsigned long int           unsigned long int
unsigned long long int      unsigned long long int

最新更新