Два дополнения stm32 c - PullRequest
       8

Два дополнения stm32 c

1 голос
/ 10 декабря 2011

У меня есть число "значащий байт", оно может быть 0 или 255.

Что означает 0 или -1.

Как конвертировать 255 в -1 за один раз.

У меня есть функция, которая не работает для меня:

acc->x = ((raw_data[1]) << 8) | raw_data[0];

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Если предположить, что каждый 8-й бит, установленный в 1, означает отрицательное значение (254 == -2), тогда должно произойти расширенное преобразование из типов со знаком :

int n = (signed char)somebyte;

так

unsigned char rawdate[2] = ...;
int msbyte = (signed char)rawdata[1];
acc->x = (msbyte << 8) | (raw_data[0] & 0xFF);
1 голос
/ 10 декабря 2011

Я не уверен, что требуется, но вот правила арифметического преобразования целых чисел.

Если целое число назначено другому младшему биту, данные будут усечены.

Пример:

struct A {
    int c1 : 8;
    unsigned c2 : 8;
} a;

int main()
{
    short int i = 255;  // right 8 bits containing all bits set
    a.c1 = i;       // or a.c1 = 255. casting not required. 
    a.c2 = i;       // same as above.
    // prints -1, 255
    printf("c1: %d c2: %d\n", a.c1, a.c2);

    i = 511;        // 9 number of 1 bits
    a.c1 = i;       // left 9th bit will be truncated. casting not required.
    a.c2 = i;       // same as above
    // prints -1, 255
    printf("c1: %d c2: %d\n", a.c1, a.c2);

    return 0;
}

Если 8-разрядное целое число со знаком (или символ) назначено более высокому битовому целому числу (скажем, int), его знаковый бит будет сдвинут.

например:

char c = 255; // which is -1
int i = c; // i is now -1. sign bit will be shifted to 32nd bit.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...