Разобраться в коде C на предмет порядка байтов - PullRequest
2 голосов
/ 21 июля 2009

Я учусь с большим числом байтов .

1.Какова цель | \ в следующем коде?

...

#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)

  #define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
                    (((uint16_t)(A) & 0x00ff) << 8))
...

2.Какова цель (A) в коде?

Ответы [ 4 ]

16 голосов
/ 21 июля 2009

'|' является побитовым оператором ИЛИ. Это в основном сочетает в себе ценности. «A» - это параметр из #define htons. Он заключен в круглые скобки, чтобы выражения не могли запутать программиста или компилятор. Символ \ продолжает макрос на следующую строку. (Макрос обычно заканчивается в конце строки.)

Этот макрос принимает 16-битное значение в A и маскирует 8 старших бит. Затем он принимает это значение и сдвигает его вправо на 8 бит. Это означает, что верхние 8 бит теперь находятся в нижней части 16-битного значения. Затем он маскирует верхние 8 бит исходного значения в A и сдвигает оставшиеся 8 бит. Это означает, что нижние 8 бит теперь находятся наверху. Наконец, он объединяет два значения обратно в одно значение.

Конечным результатом является то, что верхний и нижний байты поменялись местами.

4 голосов
/ 21 июля 2009

Этот код является не чем иным, как стандартным макросом препроцессора C.

| является побитовым оператором ИЛИ. \ экранирует символ новой строки, поэтому #define может перейти к следующей строке. (A) - это параметр для макроса.

3 голосов
/ 21 июля 2009

| выполняет побитовое «ИЛИ» для двух целых чисел \ является escape-символом, который позволяет #define продолжить следующую строку

2 голосов
/ 21 июля 2009

Это макрос, он расширяется, когда вы его используете.

Если вы, например, используйте ("вызов") макрос как

uint16_t i = htons(0x1234);

Это расширится до:

uint16_t i =  ((((uint16_t)(0x1234) & 0xff00) >> 8) |(((uint16_t)(0x1234) & 0x00ff) << 8));

Это не так, в отличие от переменной в функции, например,

uint16_t htons(uint16_t A) 
{
   return (A & 0xff00) >> 8) | (A & 0x00ff) << 8);
}
...