Если размер массива известен, то в некоторых случаях можно применить 8 битовую арифметику при расчете индекса, даже если сама индексная переменная имеет большую разрядность. А если размерность не известна, то все надо делать как 16 бит.
Например float a[40] имеет размер меньше 256. int i; b=a[i] эквивалентно b=*(((unsigned char)i*4)+&a[0]); а если extern float a[]; b=a[i] эквивалентно b=*(((int)i*4)+&a[0]); Но это все предположения...