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.
为了避免这种情况,你需要投要么m或1800以uint32_t或一些其他类型(例如long),其中结果将做乘法之前不会溢出.
两者都正确地做到了.表达式m * 1800将按类型计算int.如果int是32位,那么它将是106200.如果int是16位,这是实现C编译器的完全可接受的方式,那么它就是-24872.