ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
821847 Топик полностью
misyachniy (06.03.2018 10:19, просмотров: 97) ответил 3m на Должно быть округление в сторону нуля. Для положительных это отброс а для отрицательных прибавление. То что сгенерил компилятор все равно выглядит подозрительно. Может в новых редакциях C что-то подкрутили тихой сапой ?
Нашел Борланд С++ версии 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 оправдан, я посыпаю голову пеплом ;-)