реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> IAR - работа с типами данных, Как выделить младший страший байт
prottoss
сообщение Jul 25 2005, 18:03
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Господа, может быть вопрос глупый и избитый. Не могу в IAR добиться выделить из переменной типа int старший или младший байт стандартными макросами - их просто нет (по моему) в IAR

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

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

.........

a = Hi©;
b = Low©;

..........
}

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

С уважением, Андрей


--------------------
Go to the top of the page
 
+Quote Post
andk
сообщение Jul 26 2005, 04:33
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 199
Регистрация: 17-12-04
Из: Миасс
Пользователь №: 1 519



a= c & 0xff; // младший
b= (c>>8) & 0xff // старший
Go to the top of the page
 
+Quote Post
d__
сообщение Jul 26 2005, 07:06
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 26-08-04
Пользователь №: 548



a=*((char *)&c);
b=*(((char *)&c)+1);
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 26 2005, 07:56
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



У andk более универсальное решение.
Решение d_ страдает зависимостью от порядка хранения байтов в памяти при использовании конкретного тулчейна.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 26 2005, 10:09
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Спасибо ребята, пока суть да дело я в это же вечер допетрил

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


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

без 0xFF

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


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

Спасибо еще раз.
С уважением, Андрей


--------------------
Go to the top of the page
 
+Quote Post
ZiB
сообщение Jul 26 2005, 12:39
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 122
Регистрация: 26-07-05
Из: Россия, Томск
Пользователь №: 7 109



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

#define BYTE(in) ((char *) & (in))
...
void fun(void)
{
char a, b;
int c;
...
a = BYTE©[1];
b = BYTE©[0];
...
}
Go to the top of the page
 
+Quote Post
BVU
сообщение Jul 26 2005, 14:24
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Какой метод использовать - дело вкуса, но предложенный вариант от andk работает стопроцентно и независимо от разновидности компилятора. Если речь идет о скорости преобразования необходимо использовать asm(держать int в двух назначенных регистрах - они и будут содержать в себе как бы уже преобразованнsе значения типа char).


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
d__
сообщение Jul 29 2005, 09:19
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 26-08-04
Пользователь №: 548



Ну неправда ваша, ну не универсальное это решение, оно тоже страдает платформенно зависимым глюком. как только оно попадет на платформу с 4байтным интом так и кирдык. Я приводил свой пример исходя из условий компромисса с существующей во входных условиях платформой(эндианессом) и не претендовал на всеобщую универсальность.
Go to the top of the page
 
+Quote Post
_pv
сообщение Jul 29 2005, 09:27
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(IgorKossak @ Jul 26 2005, 14:56)
У andk более универсальное решение.
Решение d_ страдает зависимостью от порядка хранения байтов в памяти при использовании конкретного тулчейна.
*

Мне, помнится, какой-то компилятор на
unsigned char a,b;
unsigned int c;
a=c;
b=c>>8;
сгенерил код, который честно брал и восемь раз сдвигал переменную с вместо того чтобы просто старший байт взять...
Go to the top of the page
 
+Quote Post
Vict59
сообщение Jul 29 2005, 09:35
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 70
Регистрация: 22-06-04
Из: Москва
Пользователь №: 109



Можно с помощью объединения:

// структуры для манипуляции с байтами
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] - старший байт.
Go to the top of the page
 
+Quote Post
Evgeny_CD
сообщение Jul 29 2005, 09:42
Сообщение #11


Гуру
******

Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892



Цитата(Vict59 @ Jul 29 2005, 13:35)
Можно с помощью объединения:
// структуры для манипуляции с байтами
Но зависимость от индиан все равно будет!!!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 07:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01436 секунд с 7
ELECTRONIX ©2004-2016