Арифметика у меня всегда через стек и я не могу на этапе компиляции определить что сидит в стеке - переменная или константа - поэтому остаётся только на лету смотреть и проверять в рантайме (на самом деле теоретически могу и на этапе компиляции, если начну искать паттерны в байткоде выражений)...shiny wrote:А не может такого быть, что используется var>>bitcount или явно var>>8 ?
P.S. Вот как ведут себя сдвиги 16-битного аргумента в Си (проверено в 64-битном GCC, 32-битном OpenWatcom-C/C++ и 16-битном Borland C++):
Code: Select all
-2 #0000 #0000 #FFFF
-1 #0000 #0000 #FFFF
0 #1234 #1234 #EDCB
1 #2468 #091A #F6E5
2 #48D0 #048D #FB72
3 #91A0 #0246 #FDB9
4 #2340 #0123 #FEDC
5 #4680 #0091 #FF6E
6 #8D00 #0048 #FFB7
7 #1A00 #0024 #FFDB
8 #3400 #0012 #FFED
9 #6800 #0009 #FFF6
10 #D000 #0004 #FFFB
11 #A000 #0002 #FFFD
12 #4000 #0001 #FFFE
13 #8000 #0000 #FFFF
14 #0000 #0000 #FFFF
15 #0000 #0000 #FFFF
16 #0000 #0000 #FFFF
17 #0000 #0000 #FFFF
18 #0000 #0000 #FFFF
19 #0000 #0000 #FFFF
20 #0000 #0000 #FFFF
21 #0000 #0000 #FFFF
22 #0000 #0000 #FFFF
23 #0000 #0000 #FFFF
24 #0000 #0000 #FFFF
25 #0000 #0000 #FFFF
26 #0000 #0000 #FFFF
27 #0000 #0000 #FFFF
28 #0000 #0000 #FFFF
29 #0000 #0000 #FFFF
30 #0000 #0000 #FFFF
31 #0000 #0000 #FFFF
32 #1234 #1234 #EDCB
33 #2468 #091A #F6E5
34 #48D0 #048D #FB72
35 #91A0 #0246 #FDB9
36 #2340 #0123 #FEDC
37 #4680 #0091 #FF6E
38 #8D00 #0048 #FFB7
39 #1A00 #0024 #FFDB
40 #3400 #0012 #FFED
Code: Select all
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
short w1,w2,w3,w=0x1234;
for(i=-2;i<=40;i++)
{
w1 = w<<i;
w2 = w>>i;
w3 = (~w)>>i;
printf("%i\t#%4.4X #%4.4X #%4.4X\n",i,w1&0xFFFF,w2&0xFFFF,w3&0xFFFF);
}
return 0;
}

P.P.S. Кстати я могу задействовать функционал по подсчёту тактов в эмуляторе Pseudo-86RK и сравнить время выполнения оригинальных сдвигов из Small-C и этих моих новых
