Короткий, чтобы бросить Чар - PullRequest
2 голосов
/ 15 марта 2019

Я видел, как это делалось в обе стороны. Есть ли какие-либо преимущества или недостатки в том или ином случае?

short x = 0x9D6C;
char cx[2];

First way:
cx[0] = x &0xff;
cx[1] = (x >> 8) & 0xff;

против. Второй способ:

memcpy(cx, (char*)&x, 2);

Есть мысли?

1 Ответ

0 голосов
/ 15 марта 2019

Есть ли какие-либо преимущества или недостатки в том или ином случае?

Да, поскольку функциональность может отличаться, код должен делать то, что функционально необходимо.

cx[0] = x &0xff; cx[1] = (x >> 8) & 0xff; переместить младший байт значения в cx[0], а следующий старший байт в cx[1].

memcpy(cx, (char*)&x, 2); переместить младший адресуемый байт x в cx[0], а следующий адресуемый байт x в cx[1].

Эти два подхода имеют одинаковую функциональность, когда с определенным порядковым номером и общим short размером.

Что такое best зависит от большего кода, а не от этого узкого фрагмента.


С точки зрения производительности это подпадает под микрооптимизация . Хороший компилятор может анализировать memcpy() и генерировать эффективный код без вызова функции. Время программиста лучше потратить на работу с более высокими уровнями кода для повышения производительности.


Нет необходимости в приведении в memcpy(cx, (char*)&x, 2);

Имейте в виду, что short не всегда указывается в определенном endian . Необычно short это не 2 char.

E1 >> 8 приводит к «Если E1 имеет тип со знаком и отрицательное значение, результирующее значение определяется реализацией».

Лучший код будет использовать беззнаковые типы и избежать тонких проблем.


Обратите внимание, что здесь нет приведения от short к char, как в заголовке.

...