C语言:#DEFINEd值混乱8位乘法.为什么?

Rab*_*ski 6 c embedded overflow multiplication msp430

我有以下C代码:

#define PRR_SCALE 255
...
uint8_t a = 3;
uint8_t b = 4;
uint8_t prr;
prr = (PRR_SCALE * a) / b;
printf("prr: %u\n", prr);
Run Code Online (Sandbox Code Playgroud)

如果我编译它(使用msp430平台编译器,对于一个名为contiki的小型嵌入式操作系统),结果为0,而我预期为191.(uint8_t是typedef'ed为unsigned char)

如果我将其更改为:

uint8_t a = 3;
uint8_t b = 4;
uint8_t c = 255;
uint8_t prr;
prr = (c * a) / b;
printf("prr: %u\n", prr);
Run Code Online (Sandbox Code Playgroud)

它正常工作并打印191.

在Ubuntu框中使用gcc编译这个"正常"的简单版本会在两种情况下打印正确的值.

我不确定为什么会这样.我可以通过事先将DEFINEd值赋给变量来绕过它,但我宁愿不这样做.

有谁知道这是为什么?也许有关于此的更多信息的链接?

ava*_*kar 10

简短的回答:你的编译器是错误的.(正如其他人所说,溢出没有问题.)

在这两种情况下,算术都是在int,保证至少16位长.在前片段中,因为255是一个int,因为后者是因为整体推广.

如您所述,gcc正确处理此问题.