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

前端之家收集整理的这篇文章主要介绍了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正确处理此问题.

原文链接:https://www.f2er.com/c/116552.html

猜你在找的C&C++相关文章