GCC上具有常量值的向量按位and

GCC上具有常量值的向量按位and,gcc,compiler-errors,Gcc,Compiler Errors,以下测试用例对gcc有效吗 typedef signed char v16signed_char __attribute__ ((__vector_size__ (sizeof(signed char) * 16))); v16signed_char and_imm(v16signed_char a) { v16signed_char s = a & 0xFF; return s; } 它在gcc上失败,显然是因为0xFF太大。它应该失败吗?我所说的失败是指编译器错误:

以下测试用例对gcc有效吗

typedef signed char v16signed_char __attribute__ ((__vector_size__ (sizeof(signed char) * 16)));
v16signed_char and_imm(v16signed_char a)
{
    v16signed_char s = a & 0xFF;
    return s;
}
它在gcc上失败,显然是因为0xFF太大。它应该失败吗?我所说的失败是指编译器错误:

error: conversion of scalar ‘int’ to vector ‘v4unsigned_int {aka __vector(4) signed char}’ involves truncation

操作
&
本身是有效的,幸运的是:[]

以这种方式定义的类型可以与常规C操作的子集一起使用。目前,GCC允许在这些类型上使用以下运算符:
+
-
*
/
一元减号
^
&
~
%

但是,似乎需要提供基类型的操作数

0xFF
是一个
int
,但您的基本类型是
有符号字符

因此:

文件说:

为方便起见,允许使用二进制向量运算,其中一个操作数是标量。在这种情况下,编译器将标量操作数转换为向量,其中每个元素都是操作中的标量。只有当标量可以安全地转换为向量元素类型时,才会发生转换

如果没有“可以安全转换”的定义,我不确定我是否可以自信地说您的原始代码是否应该在这些规则下编译。然而,我怀疑他们在这里采取了严格的方法,因为一个任意的
int
→<代码>签名字符
转换可能会丢失数据

它可能是(或与之相关)。或者这是可以预料的


尽管这很有趣,因为在这个文本的情况下,情况显然不是这样,在非矢量化代码中,您希望在这样的情况下,由于这个原因,通常的警告会被忽略。

您所说的“它失败”是什么意思?你说的“有效”是什么意思?请把你的问题弄清楚,并详细解释你的预期结果。我编辑了这个问题,谢谢!酷。你读过了吗?我想你在为方便起见,允许使用二进制向量运算,其中一个操作数是标量。在这种情况下,编译器将标量操作数转换为向量,其中每个元素都是操作中的标量。只有当标量可以安全地转换为向量元素类型时,才会发生转换。“。为什么0xFF不能转换为字符?我还在阅读tbh,但我想知道您是否已经排除了它作为答案的来源(将节省我一些时间:P)我认为任何更具体的答案都必须来自GCC开发人员。幸运的是,在这些部分中有一些隐藏,所以请屏住呼吸。
v16signed_char s = a & (signed char)0xFF;