我的代码在 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 的有限精度计算该术语。
我的问题是,哪个编译器做得正确?
谢谢你。
我的代码在 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 的有限精度计算该术语。
我的问题是,哪个编译器做得正确?
谢谢你。
似乎在 AtmelStudio 上,int
是 16 位的,所以m*1800
溢出,调用未定义的行为。在您的情况下,编译器给出的行为可能是将模 65536 减少到范围 [-32768,32767] 中,产生-24872
. 然后tc - (m*1800)
是 132772。
为避免这种情况,您需要在执行乘法之前将结果转换为m
or 1800
touint32_t
或其他一些类型(例如long
),其中结果不会溢出。
两者都做对了。表达式m * 1800
将被计算为 type int
。如果int
是 32 位,那么它将是106200
. 如果int
是 16 位,这是实现 C 编译器的完全可接受的方式,那么它就是-24872
.