c - C代码中忽略的模数操作数

标签 c integer-arithmetic operands

我有以下代码:

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

生成以下反汇编:

unsigned short prev = ((wrLine - 1) % LINES_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) % LINES_IN_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/

相关文章:

c - 使用链表结构跟踪 C 程序中可能的内存泄漏

c - 尝试使用 memcpy 复制 char 指针,出现错误

javascript - JavaScript 和 HTML 中数字的所有数字之和

c# - 帮助类里面的数学操作数 (c#)

python - 求和函数概率类型错误: unsupported operand type(s) for +: 'int' and 'str'

types - 运算符操作数类型不匹配

python - PyThreadState_GET() 从 PyImport_GetModuleDict() 中返回 NULL

可以使用多个 _Generic 来创建字符串文字吗?

c++将存储在链表中的两个大数相乘

javascript - 9933272057275866 是一个神奇的数字吗?