我有以下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);
如果我编译它(使用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);
它正常工作并打印191.
在Ubuntu框中使用gcc编译这个“正常”的简单版本会在两种情况下打印正确的值.
我不确定为什么会这样.我可以通过事先将DEFINEd值赋给变量来绕过它,但我宁愿不这样做.
有谁知道这是为什么?也许有关于此的更多信息的链接?
解决方法
简短的回答:你的编译器是错误的. (正如其他人所说,溢出没有问题.)
在这两种情况下,算术都是在int中完成的,保证长度至少为16位.在之前的片段中,因为255是一个int,后者是因为integral promotion.
如您所述,gcc正确处理此问题.