Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR - работа с типами данных
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
prottoss
Господа, может быть вопрос глупый и избитый. Не могу в IAR добиться выделить из переменной типа int старший или младший байт стандартными макросами - их просто нет (по моему) в IAR

Примерно вот так хочу

void fun(void)
{ char a, b;
int c

.........

a = Hi©;
b = Low©;

..........
}

Не охота заморачиваться с написанием собственных типов данных и объединений
Если кто знает как решить проблему просто, напишите

С уважением, Андрей
andk
a= c & 0xff; // младший
b= (c>>8) & 0xff // старший
d__
a=*((char *)&c);
b=*(((char *)&c)+1);
IgorKossak
У andk более универсальное решение.
Решение d_ страдает зависимостью от порядка хранения байтов в памяти при использовании конкретного тулчейна.
prottoss
Спасибо ребята, пока суть да дело я в это же вечер допетрил

Цитата
a= c & 0xff; // младший
b= (c>>8) & 0xff // старший


работает так же
а = (char)c;
b= (char)(c >> 8);

без 0xFF

Цитата
a=*((char *)&c);
b=*(((char *)&c)+1);


А эта штука незаменима при работе с переменными в памяти данных.

Спасибо еще раз.
С уважением, Андрей
ZiB
Всем привет, на мой взгляд наиболее логично и красиво, а так же сменьшим асм-кодом, решить эту проблему можно вот так:

#define BYTE(in) ((char *) & (in))
...
void fun(void)
{
char a, b;
int c;
...
a = BYTE©[1];
b = BYTE©[0];
...
}
BVU
Какой метод использовать - дело вкуса, но предложенный вариант от andk работает стопроцентно и независимо от разновидности компилятора. Если речь идет о скорости преобразования необходимо использовать asm(держать int в двух назначенных регистрах - они и будут содержать в себе как бы уже преобразованнsе значения типа char).
d__
Ну неправда ваша, ну не универсальное это решение, оно тоже страдает платформенно зависимым глюком. как только оно попадет на платформу с 4байтным интом так и кирдык. Я приводил свой пример исходя из условий компромисса с существующей во входных условиях платформой(эндианессом) и не претендовал на всеобщую универсальность.
_pv
Цитата(IgorKossak @ Jul 26 2005, 14:56)
У andk более универсальное решение.
Решение d_ страдает зависимостью от порядка хранения байтов в памяти при использовании конкретного тулчейна.
*

Мне, помнится, какой-то компилятор на
unsigned char a,b;
unsigned int c;
a=c;
b=c>>8;
сгенерил код, который честно брал и восемь раз сдвигал переменную с вместо того чтобы просто старший байт взять...
Vict59
Можно с помощью объединения:

// структуры для манипуляции с байтами
typedef union {
WORD w;
BYTE b[2];
} TWOBYTEPACK ;
typedef union {
unsigned long l;
BYTE b[4];
} FOURBYTEPACK;
typedef union {
float f;
BYTE b[4];
} FLOATPACK;
//
TWOBYTEPACK Dat;

И спокойно работать с Dat.w, Dat.b[0] - младший байт, Dat.b[1] - старший байт.
Evgeny_CD
Цитата(Vict59 @ Jul 29 2005, 13:35)
Можно с помощью объединения:
// структуры для манипуляции с байтами
Но зависимость от индиан все равно будет!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.