Операция &
сама по себе действительна, к счастью: [ ref ]
Типы, определенные таким образом, могут использоваться с подмножеством нормальных C операций. В настоящее время G CC позволяет использовать следующие операторы для этих типов: +
, -
, *
, /
, unary minus
, ^
, |
, &
, ~
, %
.
Однако, похоже, вам необходимо предоставить операнд базового типа.
0xFF
- это int
, но ваш базовый тип - signed char
.
Итак:
v16signed_char s = a & (signed char)0xFF;
Документация гласит:
Для удобства разрешено использовать двоичную векторную операцию, где один операнд равен скаляр В этом случае компилятор преобразует скалярный операнд в вектор, где каждый элемент является скаляром операции. Преобразование происходит только в том случае, если скаляр можно безопасно преобразовать в тип векторного элемента.
Без определения «можно безопасно преобразовать», я не уверен, что могу с уверенностью сказать, является ли ваш оригинальный код предполагается для компиляции в соответствии с этими правилами. Тем не менее, я подозреваю, что они применили строгий подход, поскольку произвольное преобразование int
→ signed char
может привести к потере данных.
Это может быть (или иметь отношение к) ошибка 53784 . Или это можно ожидать.
Хотя это интересно, потому что в случае этого литерала это явно не так, и в не векторизованном коде вы ожидаете, что обычное предупреждение будет исключено в подобных ситуациях для этого причина.