Использование ~:)
unsigned umod(int a, unsigned b)
{
if (a<0) return b-1-~a%b;
return a%b;
}
%
имеет более высокий приоритет, чем -
Если можно вернуть b вместо 0, когда -a кратно b, вы можете сохранить некоторые операции
unsigned umod(int a, unsigned b)
{
if (a<0) return b - (-a % b);
return a%b;
}
слегка игра в гольф:)
unsigned umod(int a, unsigned b)
{
return(a<0)?b-(-a%b):a%b;
}
Вот итоговая сборка
1 .globl umod3
2 .type umod3, @function
3 umod3:
4 .LFB3:
5 .cfi_startproc
6 testl %edi, %edi
7 js .L18
8 movl %edi, %eax
9 xorl %edx, %edx
10 divl %esi
11 movl %edx, %eax
12 ret
13 .p2align 4,,10
14 .p2align 3
15 .L18:
16 movl %edi, %eax
17 xorl %edx, %edx
18 negl %eax
19 divl %esi
20 subl %edx, %esi
21 movl %esi, %edx
22 movl %edx, %eax
23 ret