Do you have a question? Post it now! No Registration Necessary
- Leha Bishletov
January 27, 2005, 8:11 am

Hello, All!
Работаю с GCC для ARM и обнаружил одну странность. Вот исходный код:
unsigned long a[4];
volatile unsigned int i;
void f()
{
i=(&(a[1]))-(&(a[0]));
}
После компиляции (оптимизация выключена) получается:
....
ldr r2, .L2
mov r3, #1 <<<<<<<<<<<<<<<<<<<<<
str r3, [r2, #0]
.....
Если немного изменить исходный код
i=(a+1)-(a);
то ни чего не изменится, а если изменить так:
i=((int)(&(a[1])))-((int)(&(a[0])));
то получится:
ldr r2, .L2
mov r3, #4 <<<<<<<<<<<<<<<<<<<<<<
str r3, [r2, #0]
Что кажется более правильным.
Интересно, это gcc ошибается, или все же я чего-то не понимаю?
With best regards, Leha Bishletov. E-mail: snipped-for-privacy@rol.ru
Работаю с GCC для ARM и обнаружил одну странность. Вот исходный код:
unsigned long a[4];
volatile unsigned int i;
void f()
{
i=(&(a[1]))-(&(a[0]));
}
После компиляции (оптимизация выключена) получается:
....
ldr r2, .L2
mov r3, #1 <<<<<<<<<<<<<<<<<<<<<
str r3, [r2, #0]
.....
Если немного изменить исходный код
i=(a+1)-(a);
то ни чего не изменится, а если изменить так:
i=((int)(&(a[1])))-((int)(&(a[0])));
то получится:
ldr r2, .L2
mov r3, #4 <<<<<<<<<<<<<<<<<<<<<<
str r3, [r2, #0]
Что кажется более правильным.
Интересно, это gcc ошибается, или все же я чего-то не понимаю?
With best regards, Leha Bishletov. E-mail: snipped-for-privacy@rol.ru

Ошибка в вычислениях адресов у GCC ?
Thu Jan 27 2005 11:11, Leha Bishletov wrote to All:
LB> i=(&(a[1]))-(&(a[0]));
LB> i=(a+1)-(a);
LB> то ни чего не изменится, а если изменить так:
по стандарту - количество элементов между двумя указателями
LB> i=((int)(&(a[1])))-((int)(&(a[0])));
LB> то получится:
разница между значениями адресов. Компилятор все нормально делает.
Генка на сервере pochtamt.ru в ящике mgs2001
LB> i=(&(a[1]))-(&(a[0]));
LB> i=(a+1)-(a);
LB> то ни чего не изменится, а если изменить так:
по стандарту - количество элементов между двумя указателями
LB> i=((int)(&(a[1])))-((int)(&(a[0])));
LB> то получится:
разница между значениями адресов. Компилятор все нормально делает.
Генка на сервере pochtamt.ru в ящике mgs2001