如何解决数字末尾带和不带“u”的宏常量
用法有什么区别
#define CONSTANT_1 (256u)
#define CONSTANT_2 (0XFFFFu)
和
#define CONSTANT_1 (256)
#define CONSTANT_2 (0XFFFF)
解决方法
尾随的 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 之类的一些行业标准要求这种不断输入,在我看来,这是一种适得其反的建议。
,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。