C
Ist leider tatsächlich nur eine spezielle Behandlung für gewisse Zahlen.
cin >> x;
int y = ( x % 1000 + 1000 ) % 1000;
cout << y << '\n';
int z = (unsigned)x % 1000;
cout << z << '\n';
führt zu
call _ZNSirsERi
movl 8(%rsp), %esi
movl $_ZSt4cout, %edi
movl %esi, %eax
imull %ebx // (1)
movl %esi, %eax
sarl $31, %eax
sarl $6, %edx
subl %eax, %edx
imull $1000, %edx, %edx
subl %edx, %esi
addl $1000, %esi
movl %esi, %eax
imull %ebx // (2)
movl %esi, %eax
sarl $31, %eax
sarl $6, %edx
subl %eax, %edx
imull $1000, %edx, %edx
subl %edx, %esi
call _ZNSolsEi
movq %rbp, %rsi
movl $1, %edx
movq %rax, %rdi
movb $10, 15(%rsp)
call _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
movl 8(%rsp), %esi
movl $_ZSt4cout, %edi
movl %esi, %eax
mull %ebx
shrl $6, %edx
imull $1000, %edx, %edx
subl %edx, %esi
call _ZNSolsEi
movq %rbp, %rsi
movl $1, %edx
movq %rax, %rdi
movb $10, 15(%rsp)
call _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
also 2 Divisionen (durch Multiplikation ersetzt) im ersten Fall.