Полная версия этой страницы:
IAR - работа с типами данных
prottoss
Jul 25 2005, 18:03
Господа, может быть вопрос глупый и избитый. Не могу в IAR добиться выделить из переменной типа int старший или младший байт стандартными макросами - их просто нет (по моему) в IAR
Примерно вот так хочу
void fun(void)
{ char a, b;
int c
.........
a = Hi©;
b = Low©;
..........
}
Не охота заморачиваться с написанием собственных типов данных и объединений
Если кто знает как решить проблему просто, напишите
С уважением, Андрей
a= c & 0xff; // младший
b= (c>>8) & 0xff // старший
a=*((char *)&c);
b=*(((char *)&c)+1);
IgorKossak
Jul 26 2005, 07:56
У andk более универсальное решение.
Решение d_ страдает зависимостью от порядка хранения байтов в памяти при использовании конкретного тулчейна.
prottoss
Jul 26 2005, 10:09
Спасибо ребята, пока суть да дело я в это же вечер допетрил
Цитата
a= c & 0xff; // младший
b= (c>>8) & 0xff // старший
работает так же
а = (char)c;
b= (char)(c >> 8);
без 0xFF
Цитата
a=*((char *)&c);
b=*(((char *)&c)+1);
А эта штука незаменима при работе с переменными в памяти данных.
Спасибо еще раз.
С уважением, Андрей
Всем привет, на мой взгляд наиболее логично и красиво, а так же сменьшим асм-кодом, решить эту проблему можно вот так:
#define BYTE(in) ((char *) & (in))
...
void fun(void)
{
char a, b;
int c;
...
a = BYTE©[1];
b = BYTE©[0];
...
}
Какой метод использовать - дело вкуса, но предложенный вариант от andk работает стопроцентно и независимо от разновидности компилятора. Если речь идет о скорости преобразования необходимо использовать asm(держать int в двух назначенных регистрах - они и будут содержать в себе как бы уже преобразованнsе значения типа char).
Ну неправда ваша, ну не универсальное это решение, оно тоже страдает платформенно зависимым глюком. как только оно попадет на платформу с 4байтным интом так и кирдык. Я приводил свой пример исходя из условий компромисса с существующей во входных условиях платформой(эндианессом) и не претендовал на всеобщую универсальность.
Цитата(IgorKossak @ Jul 26 2005, 14:56)
У
andk более универсальное решение.
Решение
d_ страдает зависимостью от порядка хранения байтов в памяти при использовании конкретного тулчейна.
Мне, помнится, какой-то компилятор на
unsigned char a,b;
unsigned int c;
a=c;
b=c>>8;
сгенерил код, который честно брал и восемь раз сдвигал переменную с вместо того чтобы просто старший байт взять...
Vict59
Jul 29 2005, 09:35
Можно с помощью объединения:
// структуры для манипуляции с байтами
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
Jul 29 2005, 09:42
Цитата(Vict59 @ Jul 29 2005, 13:35)
Можно с помощью объединения:
// структуры для манипуляции с байтами
Но зависимость от индиан все равно будет!!!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.