霓虹灯比较
根据Neon文档:
- 如果对于通道的比较为真,则该通道中的结果将所有位设置为1。 如果通道的比较为假,则所有位都设置为零。 返回类型是无符号整数类型。
我写了一小段代码来检查这个,我观察结果为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
您正在显示值,就像它们已签名一样,因为您使用%d
作为printf
格式说明符。 如果使用%u
您将看到等效的无符号值( 0
或UINT_MAX
)。
请注意,在这种情况下,signed-ness并不是特别重要 – 您可以将比较结果视为无符号掩码(全0或全1)或有符号整数值(0或-1) – 它是相同的基础位模式 – 只需使用在您使用结果的特定上下文中有意义的。
这里根据霓虹文档,也提到所有位将设置为1。
那是在这里:
Binary 1111 1111 1111 1111 1111 1111 1111 1111 = Decimal 4294967295
并使用%u代替%d。您将获得结果:
结果: 0 4294967295 0 4294967295
你得到的结果为-1表示所有位都设置为1。这可以用于进一步的逻辑运算,如按位和按位或操作。