Требуется ли маскировка в этом случае? - PullRequest
5 голосов
/ 17 ноября 2011

В приведенном ниже коде указана маскировка, необходимая для назначения.

unsigned int x = 0x01020304;
unsigned char a1, a2, a3, a4;

a1 = (x >> 24) & 0xff;
a2 = (x >> 16) & 0xff;
a3 = (x >> 8) & 0xff;
a4 = x & 0xff ;

Я понимаю, что без него все работает хорошо, но я нахожу такие назначения во всем стандартном / проверенном коде ... разве это не пустая трата времени ??

Спасибо за ваши ответы на приведенный выше код. Похоже, что компилятор проигнорировал (оптимизировал) маскирование, как видно из приведенного ниже objdump.

a1 = (x >> 24) & 0xff;

804838b:    8b 45 fc                mov    0xfffffffc(%ebp),%eax
804838e:    c1 e8 18                shr    $0x18,%eax
8048391:    88 45 fb                mov    %al,0xfffffffb(%ebp)

Ответы [ 5 ]

1 голос
/ 17 ноября 2011

Мне нравится код маскировки, поскольку он четко отражает намерение автора, состоящее в том, чтобы сохранить только последние 8 битов от каждой операции. Компилятор может оптимизировать его (на платформах, где байт имеет ровно 8 бит), а на других платформах маскировка в любом случае необходима.

0 голосов
/ 17 ноября 2011

Во всех практических целях у вас все нормально без маски. Но согласно спецификации, вам нужна маска, поскольку фактический размер символа зависит от архитектуры, и в этом случае, я считаю, вы должны надеяться, что его размер составляет не менее 8 бит (опять же, не гарантируется, в зависимости от архитектуры).

Нет, я не могу назвать ни одну современную машину, которая не использует 8-битные байты (таким образом, отказ от ответственности "всех практических целей"). Но многие старые машины в прошлом, конечно, не сделали.

0 голосов
/ 17 ноября 2011

Для большинства систем с 8-битным символом маскирование не нужно и визуально некрасиво, но оно не имеет значения для сгенерированного кода, если ваш компилятор не сможет выполнить какую-либо оптимизацию. Если CHAR_BIT>8, то для получения желаемого поведения необходима явная маскировка.

0 голосов
/ 17 ноября 2011

Да, это так - немного расширите код, чтобы он выглядел так, как уже было сделано.

a1=0x01 & 0xff // ok not really needed here
a2=0x0102 & 0xff // needed here because I just want the 02 from the hex
a3=0x010304 & 0xff // needed here because I just want the 04 from the hex
a4=0x01020405 & 0xff // needed again because I just want the 05 from the hex
0 голосов
/ 17 ноября 2011

Так безопаснее сделать это.Представьте, что произойдет, если a1 был изменен на int.Это не должно быть медленнее, поскольку компилятор знает, что приведение к символу включает маскирование нескольких битов.

Интересно, что 0xff не всегда может быть правильной маской - UCHAR_MAX из stdint.h будет платформойнезависимый.

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