size_t modulo long unsigned int的意外结果

时间:2017-03-22 16:33:05

标签: c

在以下代码中,BITS_IN_INTlong 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;
}

1 个答案:

答案 0 :(得分:2)

宏扩展后,最后一个printf如下:

printf("%lu\n", i % sizeof(int) * 8);

因此,表达式(在printf中)被评估为:

(i % sizeof(int)) * 8

如果sizeof(int)为4(在您的平台上似乎是这种情况),那么i % sizeof(int)会产生0; 0 * 80

如果可以,请避免使用宏。如果没有,请始终在宏周围使用括号:

#define BITS_IN_INT (sizeof(int) * CHAR_BIT)

注意:%zu是打印size_t值的正确格式说明符。