C表达式在两个不同编译器上的评估方式不同

NXT*_*NXT 10 c gcc language-lawyer atmelstudio

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

uint32_t tc = 107900;
int8_t   m  = 59;

tc = tc - (m*1800);
Run Code Online (Sandbox Code Playgroud)

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

使用AtmelStudio,结果tc是132772,这是不正确的.

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

我的问题是,哪个编译器正确地执行了它?

谢谢.

R..*_*R.. 10

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

为了避免这种情况,你需要投要么m1800uint32_t或一些其他类型(例如long),其中结果将做乘法之前不会溢出.


Lee*_*ker 6

两者都正确地做到了.表达式m * 1800将按类型计算int.如果int是32位,那么它将是106200.如果int是16位,这是实现C编译器的完全可接受的方式,那么它就是-24872.

  • 实际上在后一种情况下它是未定义的. (2认同)