Арифметика у меня всегда через стек и я не могу на этапе компиляции определить что сидит в стеке - переменная или константа - поэтому остаётся только на лету смотреть и проверять в рантайме (на самом деле теоретически могу и на этапе компиляции, если начну искать паттерны в байткоде выражений)...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 и этих моих новых

 
				
 
  
 
 
 

 
