10

我的代码在 GCC 和 Atmel Studio 之间运行不同:

uint32_t tc = 107900;
int8_t   m  = 59;

tc = tc - (m*1800);

在 GCC 上,结果tc是 1700,正如预期的那样。

使用 AtmelStudio,输入的结果tc是 132772,这是不正确的。

问题似乎是m*1800使用 AtmelStudio 以 m 的有限精度计算该术语。

我的问题是,哪个编译器做得正确?

谢谢你。

4

2 回答 2

10

似乎在 AtmelStudio 上,int是 16 位的,所以m*1800溢出,调用未定义的行为。在您的情况下,编译器给出的行为可能是将模 65536 减少到范围 [-32768,32767] 中,产生-24872. 然后tc - (m*1800)是 132772。

为避免这种情况,您需要在执行乘法之前将结果转换为mor 1800touint32_t或其他一些类型(例如long),其中结果不会溢出。

于 2014-04-16T02:36:05.637 回答
6

两者都做对了。表达式m * 1800将被计算为 type int。如果int是 32 位,那么它将是106200. 如果int是 16 位,这是实现 C 编译器的完全可接受的方式,那么它就是-24872.

于 2014-04-16T02:37:24.150 回答