Неявное приведение типов в C (преобразование 32-битного без знака в 8-битный и int) - PullRequest
8 голосов
/ 28 июня 2010

Мой вопрос очень похож на

Как сохранить 64-битное целое число в двух 32-битных целых и преобразовать обратно

(у меня есть 32-разрядный без знака, который мне нужно поместить в 4 8-разрядных переменных без знака в C)

но

У меня такой вопрос:

uint8_t a;
uint32_t b;
a = b;

гарантирует, что a заполнено восемью крайними правыми битами, а не восемью крайними левыми битами?

Ответы [ 4 ]

16 голосов
/ 28 июня 2010

Да.Сделайте или это:

uint32_t num32 = 0xdeadbeef;

uint8_t a = num32;       /* 0xef */
uint8_t b = num32 >> 8;  /* 0xbe */
uint8_t c = num32 >> 16; /* 0xad */
uint8_t d = num32 >> 24; /* 0xde */

Или это:

union u
{
    uint32_t num32;

    struct
    {
        uint8_t a;
        uint8_t b;
        uint8_t c;
        uint8_t d;

    } bytes;

} converter;

converter.num32 = 0xdeadbeef;

Первый пример не зависит от порядка байтов платформы, второй делает .

9 голосов
/ 28 июня 2010

Я не знаю, что вы подразумеваете под самыми правыми и самыми левыми (порядковый номер?), Но C гарантирует, что a будет содержать 8 младших (младших) битов младшего разряда b.То есть назначение будет логически эквивалентно:

a = b % ((uint32_t)UINT8_MAX + 1);
5 голосов
/ 28 июня 2010

Из стандарта C гарантируется, что a == b % (max_of_uint8_t + 1), то есть младшие 8 бит. В разделе 6.3.1.3 (Целые числа со знаком и без знака):

  1. Когда значение с целочисленным типом преобразуется в другой целочисленный тип, отличный от _Bool, если значение может быть представлено новым типом, оно не изменяется.
  2. В противном случае, если новый тип является беззнаковым, значение преобразуется путем многократного сложения или вычитания более чем максимального значения, которое может быть представлено в новом типе, до тех пор, пока значение не окажется в диапазоне нового типа.

Используйте a = b & 0xff, если вам нужно быть в безопасности.

0 голосов
/ 28 июня 2010

Вы можете посмотреть на декларацию объединения .Если вы можете гарантировать, что процессор / источник данных не изменится, я думаю, вы можете принять ' endianness '

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...