Как я разделяю длинное значение (32 бита) на четыре символьных переменные (8 битов), использующих C?

У меня есть переменная 32 бита длиной, CurrentPosition, который я хочу разделить на 4, символы на 8 битов. Как я сделал бы это наиболее эффективно в C? Я работаю с MCU на 8 битов, 8051 architectecture.

unsigned long CurrentPosition = 7654321;
unsigned char CP1 = 0;
unsigned char CP2 = 0;
unsigned char CP3 = 0;
unsigned char CP4 = 0;
// What do I do next? 

Я должен просто сослаться на начальный адрес CurrentPosition с указателем и затем добавить 8 два тех адреса четыре раза?

Это - прямой порядок байтов.

ТАКЖЕ я хочу, чтобы CurrentPosition остался неизменным.

10
задан skaffman 30 April 2010 в 20:17
поделиться

5 ответов

    CP1 = (CurrentPosition & 0xff000000UL) >> 24;
    CP2 = (CurrentPosition & 0x00ff0000UL) >> 16;
    CP3 = (CurrentPosition & 0x0000ff00UL) >>  8;
    CP4 = (CurrentPosition & 0x000000ffUL)      ;

Вы также можете получить доступ к байтам через указатель,

unsigned char *p = (unsigned char*)&CurrentPosition;
//use p[0],p[1],p[2],p[3] to access the bytes.
19
ответ дан 3 December 2019 в 15:35
поделиться

Я думаю, вам следует подумать об использовании объединения:

union {
   unsigned long position;
   unsigned char bytes[4];
} CurrentPosition;

CurrentPosition.position = 7654321;

Теперь к байтам можно получить доступ как: CurrentPosition.bytes [ 0], ..., CurrentPosition.bytes [3]

7
ответ дан 3 December 2019 в 15:35
поделиться

Если вы используете 8-битный MCU, сдвиг всей 32-битной переменной - это небольшая работа. В этом случае лучше прочитать 4 байта CurrentPosition, используя арифметику указателя. Приведение:

unsigned char *p = (unsigned char*)&CurrentPosition;

не изменяет CurrentPosition, но если вы попытаетесь записать в p [0], вы измените младший значащий байт CurrentPosition. Если Вам нужна копия, сделайте следующее:

unsigned char *p = (unsigned char*)&CurrentPosition;
unsigned char arr[4];
arr[0] = p[0];
arr[1] = p[1];
arr[2] = p[2];
arr[3] = p[3];

и работайте с обр. (Если вы хотите, чтобы старший байт сначала изменил порядок в этих назначениях).

Если вы предпочитаете 4 переменные, вы, очевидно, можете сделать:

unsigned char CP1 = p[0];
unsigned char CP2 = p[1];
unsigned char CP3 = p[2];
unsigned char CP4 = p[3];
2
ответ дан 3 December 2019 в 15:35
поделиться
CP1 = (unsigned char)(CurrentPosition & 0xFF);
CurrentPosition >>= 8;
CP2 = (unsigned char)(CurrentPosition & 0xFF);
...
0
ответ дан 3 December 2019 в 15:35
поделиться
unsigned char *CP = &CurrentPosition;

Теперь доступ к CPn по вашему исходному коду осуществляется через CP [n] .

0
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: