Разделение на макроопределенный int в C дает странный результат

Мне интересно, почему эта программа, похоже, не делает целочисленное деление должным образом, когда знаменатель определен в макросе.

#include <stdio.h>
#define A 2
#define B 64
#define C A * B

int main() {
 int addr = 64;
 int idx = addr / C;
 printf("C=%d\n", C);
 printf("%d\n", idx);
 printf("%d\n", addr / 128);
 return 0;
}
</stdio.h>

Выход на моем компьютере:

C=128
2048
0

Ожидаемый результат:

C=128
0
0
2 ответа

int idx = addr / C;

становится

int idx = addr / A * B; // or 64/2 * 64 == 32*64


После макрорасширения у вас есть

addr / 2 * 64

Из-за уверенности оператора, что

32 * 64

Вы можете добавить скобки в свой макрос

#define C (A * B)

licensed under cc by-sa 3.0 with attribution.