roboforum.ru

Технический форум по робототехнике.
Текущее время: 10 апр 2025, 19:21

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: [FAQ] 2*8bit to 16bit и наоборот
СообщениеДобавлено: 29 фев 2008, 20:32 
Не в сети
Аватара пользователя

Зарегистрирован: 31 янв 2006, 14:37
Сообщения: 90
Откуда: Москва
подскажите как написать, не могу найти (

char a;
char b;
int c;
c=.... ?

int c;
char a;
char b;
a=....?
b=....?

спасибо!

Добавлено спустя 1 час 6 минут 40 секунд:
для 16->2*8:
a=c; //младшие биты
b=(с>>8);//старшие биты

так ?

Добавлено спустя 8 минут:
а для 2*8->16:
c=a;//младшие
с=c+(b<<8);старшие ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 2*8bit to 16bit и наоборот
СообщениеДобавлено: 01 мар 2008, 00:46 
Не в сети
Мастер Самоделкин
Аватара пользователя

Зарегистрирован: 11 окт 2004, 19:20
Сообщения: 3678
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич
char a,b;
int c;

c=a+(int)b<<8;

обратно:

a=(char)c>>8;
b=(char)(c&&0x0F);

_________________
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 2*8bit to 16bit и наоборот
СообщениеДобавлено: 01 мар 2008, 01:29 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 09 фев 2006, 15:36
Сообщения: 3339
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков
-= Александр =- писал(а):
b=(char)(c&&0x0F);

ошибочка, должно быть (c & 0xFF),
но И с маской можно не делать, просто (char)(c)

_________________
Linux user | Firefox user


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 2*8bit to 16bit и наоборот
СообщениеДобавлено: 01 мар 2008, 02:29 
Не в сети

Зарегистрирован: 29 дек 2004, 23:15
Сообщения: 3744
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей
Код:
/**
* @def GetLowByte(x)
* @brief Извлечение из слова младшего байта
*/
#define GetLowByte(x) ((char)(x))

/**
* @def GetHighByte(x)
* @brief Извлечение из слова старшего байта
*/
#define GetHighByte(x) ((x)>>8)

/**
* Получаем слово, посредством соединения старшего и младшего байтов
* @param HighByte Старший байт
* @param LowByte Младший байт
* @return Слово(16-бит)
*/
uint16_t GetWord(uint8_t HighByte, uint8_t LowByte)
{
   return ((HighByte & 0xFF)<<8)|(LowByte & 0xFF);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 2*8bit to 16bit и наоборот
СообщениеДобавлено: 01 мар 2008, 07:29 
Не в сети
Аватара пользователя

Зарегистрирован: 03 авг 2007, 19:43
Сообщения: 1437
Откуда: Екатеринбург
прог. языки: Си, асм со словарем
для 2*8->16:
Код:
adress_с   =&с;
* adress_с   = a;
*(adress_с+1)= b;


для 16->2*8:
Код:
adress_c=&c;
a   =*adress_c;
b   =*(adress_c+1);


сколько вариантов то оказывается! :shock:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 2*8bit to 16bit и наоборот
СообщениеДобавлено: 01 мар 2008, 17:59 
Не в сети
Аватара пользователя

Зарегистрирован: 31 янв 2006, 14:37
Сообщения: 90
Откуда: Москва
всем спасибо за подсказки, программатор снова заработает, будем использовать )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [FAQ] 2*8bit to 16bit и наоборот
СообщениеДобавлено: 21 июн 2008, 18:31 
Не в сети

Зарегистрирован: 20 окт 2005, 16:11
Сообщения: 432
Откуда: Вильнюс,Литва
прог. языки: Basic
а как на бейсике это осуществить? или хотя бы на асме...
ну вообщем с помощью человека с electronix.ru во такое намутил, вдруг кому пригодиться:
Код:
Dim Val16 As Word
Dim Lowb As Byte
Dim Highb As Byte
Dim TempHb As Integer
Dim Temp As Integer
Dim Temp2 As Integer

TempHb = Val16 / 255
Highb = TempHb 'старший байт
Temp = TempHb * 255
Temp2 = Val16 - TempHb
Lowb = Temp2 - Temp 'младший байт


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [FAQ] 2*8bit to 16bit и наоборот
СообщениеДобавлено: 16 мар 2013, 13:45 
Не в сети
Аватара пользователя

Зарегистрирован: 10 ноя 2011, 12:02
Сообщения: 5691
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья
Осторожно, некропост.
Я тут обнаружил, что как минимум Raisonanse C complier для STM8 генерит жуткий говнокод для стандартной конструкции переписывания 16-бит числа в 8-бит регистры. Прошу учесть, что порядок байтов для stm8 - старший, младший, порядок записи регистров имеет значение.

Итак, стандартный код на С из всех учебников
Код:
     unsigned int ch1Sum;
...
     TIM5_CCR1H = ch1Sum >> 8;
     TIM5_CCR1L = ch1Sum;

генерит вот что:
Код:
;TIM5_CCR1H = ch1Sum >> 8;
         LDW   X,ch1Sum
         CLR   A
         RRWA  X,A
         LD    A,XL
         LD    TIM5_CCR1,A
;TIM5_CCR1L = ch1Sum;
         MOV   TIM5_CCR1+1,ch1Sum+1

Короче, жуть.
Переписываем так:
Код:
     unsigned int ch1Sum;
...
     TIM5_CCR1H = ((u8*)&ch1Sum)[0];
     TIM5_CCR1L = ch1Sum;

Получаем адекватные 2 MOVa:
Код:
;TIM5_CCR1H = ((u8*)&ch1Sum)[0];
       MOV   TIM5_CCR1,ch1Sum
;TIM5_CCR1L = ch1Sum;
       MOV   TIM5_CCR1+1,ch1Sum+1

И аналогично в обратную сторону:
Код:
    unsigned int uSonicRange;
...
      ((unsigned char *)&uSonicRise)[0] = TIM1_CCR2H;
      ((unsigned char *)&uSonicRise)[1] = TIM1_CCR2L;


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO