我有以下代码:

unsigned short wrLine;
unsigned short prev = ((wrLine - 1) % 16);
wrLine = (wrLine + 1) % 16;

生成以下反汇编:
无符号短prev=((wrLine-1)%行(IN_FIFO);
0041456A   movw      r3, #25282
0041456E   movt      r3, #8192
00414572   ldrh      r3, [r3]
00414574   uxth      r3, r3
00414576   add.w     r2, r3, #4294967295
0041457A   mov.w     r3, #15
0041457E   movt      r3, #32768
00414582   ands      r3, r2
00414584   cmp       r3, #0
00414586   bge       #10
00414588   add.w     r3, r3, #4294967295
0041458C   orn       r3, r3, #15
00414590   add.w     r3, r3, #1
00414594   strh      r3, [r7, #4]

wrLine=(wrLine+1)%在FIFO中的行;
0041463E   movw      r3, #25282
00414642   movt      r3, #8192
00414646   ldrh      r3, [r3]
00414648   uxth      r3, r3
0041464A   add.w     r2, r3, #1
0041464E   mov.w     r3, #15
00414652   movt      r3, #32768
00414656   ands      r3, r2
00414658   cmp       r3, #0
0041465A   bge       #10
0041465C   add.w     r3, r3, #4294967295
00414660   orn       r3, r3, #15
00414664   add.w     r3, r3, #1
00414668   uxth      r2, r3
0041466A   movw      r3, #25282
0041466E   movt      r3, #8192

有趣的是,如果wrLine为零,那么prev最终将等于0xFFFF,而当wrLine为15时,它将等于0x0000。知道为什么只有一个这样的作品吗?
谢谢,
德凡

最佳答案

short在执行任何运算之前,数据类型将转换为int。因为你的模量是16所以它是int而不是unsigned
如果不能使用short并且只对unsigned类型执行mod操作,请不要使用16U,这里是。

关于c - C代码中忽略的模数操作数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18643503/

10-11 15:45