在以下代码中,BITS_IN_INT
是long unsigned int
,其值为32
。为什么模运算返回值0
而不是预期的20
?
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define BITS_IN_INT sizeof(int) * CHAR_BIT
int main()
{
size_t i = 20;
printf("%zu\n", i);
printf("%lu\n", BITS_IN_INT);
printf("%lu\n", i % BITS_IN_INT);
return 0;
}
答案 0 :(得分:2)
宏扩展后,最后一个printf如下:
printf("%lu\n", i % sizeof(int) * 8);
因此,表达式(在printf中)被评估为:
(i % sizeof(int)) * 8
如果sizeof(int)
为4(在您的平台上似乎是这种情况),那么i % sizeof(int)
会产生0; 0 * 8
为0
。
如果可以,请避免使用宏。如果没有,请始终在宏周围使用括号:
#define BITS_IN_INT (sizeof(int) * CHAR_BIT)
注意:%zu
是打印size_t
值的正确格式说明符。