用法有什么区别
#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 int
而 256
的类型为 int
。另一个示例更微妙:0xFFFFu
的类型为 unsigned int
,而 0xFFFF
的类型为 int
int
只有 16 位,它的类型是 unsigned int
。
一些行业标准(例如 MISRA-C)强制要求不断输入,在我看来这是适得其反的建议。
关于c - 数字末尾有和没有 "u"的宏常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65591933/