我有以下代码:
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/