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

我有以下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正确处理此问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐