ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
820032
misyachniy (01.03.2018 16:29, просмотров: 5795)
Деление на степень двойки и сдвиг не одно и тоже (IAR ARM). Почему? Смотрел на то, что компилирует IAR и нашел непонятно поведение компилятора. Для проверки написал такую функцию volatile int Z; void zzz(void) { Z = Z >> 4; if (Z>0) Z /=16; } Получил: SECTION `.text`:CODE:NOROOT(2) THUMB // 5 void zzz(void) // 6 { // 7 Z = Z >> 4; zzz: LDR.N R0,??zzz_0 LDR R1,[R0, #+0] ASRS R1,R1,#+4 STR R1,[R0, #+0] // 8 // 9 if (Z>0) Z /=16; LDR R1,[R0, #+0] CMP R1,#+1 BLT.N ??zzz_1 LDR R1,[R0, #+0] MOV R2,R1 ASRS R2,R2,#+3 ADD R1,R1,R2, LSR #+28 ASRS R1,R1,#+4 STR R1,[R0, #+0] // 10 // 11 } ??zzz_1: BX LR ;; return Явно видно, что деление сдвигом отбрасывает остаток деления как и положено в C. А при явно указанном делении, происходит округление по правилам арифметики, а не C. Или я не прав?