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

 
 
 
Reply to this topicStart new topic
> Преобразование типов WinAVR, Преобразование типов int16_t
Monet
сообщение Mar 30 2010, 18:49
Сообщение #1





Группа: Участник
Сообщений: 3
Регистрация: 14-03-10
Из: Донецк
Пользователь №: 55 960



Добрый день, уважаемые коллеги.

Возникла задача следующего характера: есть число типа int16_t, в WinAVR необходимо создать массив из двух элементов unsigned char, первый элемент - младший байт числа int16_t, а второй - соответственно старший байт.

Заранее всем спасибо.
Go to the top of the page
 
+Quote Post
ataradov
сообщение Mar 30 2010, 19:04
Сообщение #2


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

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



int16_t num;
unsigned char arr[2];

arr[0] = num & 0xff;
arr[1] = (num >> 8) & 0xff;

Или не портабельный вариант:

*((int16_t *)arr) = num;
Go to the top of the page
 
+Quote Post
Monet
сообщение Mar 30 2010, 19:15
Сообщение #3





Группа: Участник
Сообщений: 3
Регистрация: 14-03-10
Из: Донецк
Пользователь №: 55 960



Цитата(Taradov Alexander @ Mar 30 2010, 22:04) *
int16_t num;
unsigned char arr[2];

arr[0] = num & 0xff;
arr[1] = (num >> 8) & 0xff;

Или не портабельный вариант:

*((int16_t *)arr) = num;



Большое спасибо!!!
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 31 2010, 03:44
Сообщение #4


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Monet @ Mar 31 2010, 01:49) *
Возникла задача следующего характера: есть число типа int16_t, в WinAVR необходимо создать массив из двух элементов unsigned char, первый элемент - младший байт числа int16_t, а второй - соответственно старший байт.

Еще вариант:
Код
union
{
     int16_t value;
     int8_t array[2];
} slon;

slon.value = 12345;

int8_t low  = slon.array[0];
int8_t high = slon.array[1];



Цитата(Taradov Alexander @ Mar 31 2010, 02:04) *
int16_t num;
unsigned char arr[2];

arr[0] = num & 0xff;
arr[1] = (num >> 8) & 0xff;

Или не портабельный вариант:

*((int16_t *)arr) = num;

Первый вариант тоже не полностью портабельный (в случае влияния endian).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Ermol
сообщение Jan 25 2011, 18:56
Сообщение #5





Группа: Новичок
Сообщений: 5
Регистрация: 12-01-11
Пользователь №: 62 169



А подскажите пожалуйста как сделать в обратном порядке?
low = num & 0xff;
hi = (num >> 8) & 0xff;
если есть low и hi как получить 16-битное num ?


Сообщение отредактировал Ermol - Jan 25 2011, 18:57
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 25 2011, 19:04
Сообщение #6


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



16bit_num = (hi << 8) | low;


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Ermol
сообщение Jan 25 2011, 19:05
Сообщение #7





Группа: Новичок
Сообщений: 5
Регистрация: 12-01-11
Пользователь №: 62 169



спасибо! оперативно =)
Go to the top of the page
 
+Quote Post
alekseykoj
сообщение Feb 10 2011, 10:06
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 8-11-05
Пользователь №: 10 602



А еще вот такой.
struct Struct_IntToByte {
unsigned char m_ByteLo;
unsigned char m_ByteHi;
}

int16_t num;
struct Struct_IntToByte* h_IntToByte;

// Получение доступа
h_IntToByte = (struct Struct_IntToByte*)&num;

// Использование
h_IntToByte->m_ByteLo;
h_IntToByte->m_ByteHi;
Go to the top of the page
 
+Quote Post

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

 


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


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