用法有什么区别
#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_MAX
的unsigned int
。启用额外的警告将节省现代编译器的一天(-Wall -Werror
gcc 和 clang )。
256u
具有类型unsigned int
而256
具有类型int
。另一个例子更微妙:0xFFFFu
有类型unsigned int
,0xFFFF
有类型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