gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:08:22 24 4
gpt4 key购买 nike

我有以下代码:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com