Неоновое сравнение

Согласно неоновой документации:

  • Если сравнение истинно для линии, то результатом в этой линии являются все биты, установленные в единицу. Если сравнение для линии является ложным, все биты устанавливаются в ноль. Тип возвращаемого значения - целое число без знака.

Я написал небольшой фрагмент кода, чтобы проверить это, и я наблюдал результат как 0 и -1 вместо 0 и 1. Может кто-нибудь сказать мне причину этого?

Код:

float c1[4] = {12.0f,12.0f,12.0f,12.0f}; 
float c2[4] = {13.0f,12.0f,9.0f,12.0f};
float32x4_t t1,t2;
uint32x4_t rq;
t1 = vld1q_f32(c1);
t2 = vld1q_f32(c2);
rq = vceqq_f32(t1,t2);
printf("start\n");
for( int i = 0;i < 4; i++){
    printf("%d\n",rq[i]);
}
printf("end\n");

Результат:

start
0
-1
0
-1
end

2 ответа

Решение

Вы отображаете значения, как будто они подписаны, потому что вы используете %d как printf спецификатор формата. Если вы используете %u вы увидите эквивалентные значения без знака (0 или же UINT_MAX).

Обратите внимание, что в этом контексте подпись не особенно важна - вы можете рассматривать результаты сравнения как маски без знака (все 0 или все 1) или как целочисленные значения со знаком (0 или -1) - это тот же базовый битовый шаблон - просто используйте все, что имеет смысл в конкретном контексте, где вы используете результат.

Здесь, согласно неоновому документу, также упоминается, что все биты будут установлены в единицу.

Вот здесь:

Binary 1111 1111 1111 1111 1111 1111 1111 1111 = Decimal 4294967295

И используйте%u вместо%d . Вы получите результат как:

Результат: 0 4294967295 0 4294967295

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

Другие вопросы по тегам