roboforum.ru

Технический форум по робототехнике.

[FAQ] 2*8bit to 16bit и наоборот

Ответы на наиболее часто встречающиеся вопросы.

[FAQ] 2*8bit to 16bit и наоборот

Сообщение toshas » 29 фев 2008, 20:32

подскажите как написать, не могу найти (

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);старшие ?
Аватара пользователя
toshas
 
Сообщения: 90
Зарегистрирован: 31 янв 2006, 14:37
Откуда: Москва

Re: 2*8bit to 16bit и наоборот

Сообщение -= Александр =- » 01 мар 2008, 00:46

char a,b;
int c;

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

обратно:

a=(char)c>>8;
b=(char)(c&&0x0F);
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Re: 2*8bit to 16bit и наоборот

Сообщение Vooon » 01 мар 2008, 01:29

-= Александр =- писал(а):b=(char)(c&&0x0F);

ошибочка, должно быть (c & 0xFF),
но И с маской можно не делать, просто (char)(c)
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: 2*8bit to 16bit и наоборот

Сообщение Сергей » 01 мар 2008, 02:29

Код: Выделить всёРазвернуть
/**
* @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);
}
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

2*8bit to 16bit и наоборот

Сообщение rig » 01 мар 2008, 07:29

для 2*8->16:
Код: Выделить всёРазвернуть
adress_с   =&с;
* adress_с   = a;
*(adress_с+1)= b;


для 16->2*8:
Код: Выделить всёРазвернуть
 adress_c=&c;
a   =*adress_c;
b   =*(adress_c+1);


сколько вариантов то оказывается! :shock:
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Re: 2*8bit to 16bit и наоборот

Сообщение toshas » 01 мар 2008, 17:59

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

Re: [FAQ] 2*8bit to 16bit и наоборот

Сообщение Кирилл » 21 июн 2008, 18:31

а как на бейсике это осуществить? или хотя бы на асме...
ну вообщем с помощью человека с 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 'младший байт
Кирилл
 
Сообщения: 432
Зарегистрирован: 20 окт 2005, 16:11
Откуда: Вильнюс,Литва
прог. языки: Basic

Re: [FAQ] 2*8bit to 16bit и наоборот

Сообщение elmot » 16 мар 2013, 13:45

Осторожно, некропост.
Я тут обнаружил, что как минимум 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;
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья


Вернуться в FAQ

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

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