[an error occurred while processing this directive] [an error occurred while processing this directive]
Демократичный вопрос: каждый может отличиться :-))
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Mik 07 января 2002 г. 20:54
В ответ на: Господа, как грамотно в Си преобразовать int в char и работать с другими многобайтными переменными побайтно? отправлено Jedi 07 января 2002 г. 20:13

Не устою и я перед соблазном :-))
Есть несколько способов.
1) Сдвиги:
unsigned char least_significant_byte = (unsigned char)int_var;
unsigned char next_significant_byte = (unsigned char)(int_var>>8);
и т.д.
2) Объединения:
union TwoBytes
{
int word;
char bytes[2];
};
unsigned char least_significant_byte = ((union TwoBytes)int_var).bytes[0];
unsigned char next_significant_byte = ((union TwoBytes)int_var).bytes[1];
В этом примере важен порядок хранения байтов в памяти (least significant byte first или 'little endian' предполагается в этом примере, а вообще зависит от реализации).
3) Указатели:
unsigned char least_significant_byte = *(unsigned char*)&int_var;
unsigned char next_significant_byte = *(((unsigned char*)&int_var)+1);
В этом примере также важен порядок хранения байтов в памяти.

Первый способ применим только к int и long, поскольку у других типов сдвигов нет. Какой из способов сгенерирует более эффективный код - зависит от компилятора.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru