Нашел Борланд С++ версии 3.1. Результат следующий ; int_signed =-257;
mov si,-257
; int_unsigned =257;
mov di,257
; printf("\n shift s/u %d/%d div s/u %d/%d", int_signed>>4, int_unsigned>>4, int_signed/16, int_unsigned/16);
mov ax,di
mov bx,16
cwd
idiv bx
push ax
mov ax,si
mov bx,16
cwd
idiv bx
push ax
mov ax,di
mov cl,4
sar ax,cl
push ax
mov ax,si
mov cl,4
sar ax,cl
push ax
mov ax,offset DGROUP:s@
push ax
call near ptr _printf
add sp,10
Из текста видно, что вызываются команды целочисленного деления и арифметического сдвига.
В результате не корректным оказался сдвиг -257 на 4 разряда вправо результат минус 17 вместо минус 16.
IAR оправдан, я посыпаю голову пеплом ;-)