Уважаемые эксперты, доброго времени суток. Помогите пожалуйста разрешить такой вопрос: почему при перемножении в коде двух unsigned int'ов компилятор использует операцию imul, хотя по логике должна применятся операция умножения беззнаковых чисел mul? И как заставить его использовать mul? unsigned int a,b,c; BC 3.1: void main() { a=2; b=3; c=a*b; } Turbo Debugger: #INST_SET#10: a=2; cs:039D C706480F0200 mov word ptr [_a],0002 #INST_SET#11: b=3; cs:03A3 C706460F0300 mov word ptr [_b],0003 #INST_SET#12: c=a*b; cs:03A9 A1480F mov ax,[_a] cs:03AC F72E460F imul word ptr [_b] cs:03B0 A3440F mov [_c],ax Thanks anyway..
Результаты команд mul и imul различаются только старшим словом при умножении 16*16->32 или 32*32->64, а младшее слово одно и то же. Поэтому при умножении unsigned int c=a*b компилятор имеет полное право использовать любую из этих инструкций. При этом, вообще говоря, imul допускает более широкие возможности для задания операндов, поэтому вполне естественно всегда использовать imul. (В данном конкретном примере можно использовать и mul, и imul, при этом в ax после выполнения будет одно и то же, а вот dx будет различаться, но на него ANSI C забивает.)