2015-05-01 8 views
0

В соответствии с документацией Неон:Неон Сравнение

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

Я написал небольшой фрагмент кода, чтобы проверить это, и я наблюдал результат как 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 

ответ

3

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

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

1

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

Вот здесь:

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

И использовать% U вместо% D .Вы получите результат:

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

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