ZHCUAQ1G June 2015 – August 2025
当算术运算符应用于向量时,该运算符会并行地应用于向量中的每个元素。生成的向量中的每个元素都是将运算符应用于源向量中对应元素的结果。
以下表格列出了向量支持的运算。“适用于”列指示运算符是可与整数向量、浮点向量、复数向量还是多种向量类型搭配使用。
| 运算符 | 说明 | 适用于 |
|---|---|---|
| - | 取反 | all |
| + | 返回值不变(不使该值为正值) | all |
| ~ | 按位补码 | 整数 |
| ! | 逻辑非 | 整数、浮点 |
| & | 向量对象的地址,即指向向量的指针(示例请参阅 节 7.15.2.1) | all |
| ++、-- | 增量/减量运算符(前缀和后缀) | 整数、复数(1) |
下面的示例中声明了一个被称为 pos_i4 的 int4 向量,并将它初始化为值 1、2、3 和 4。然后,它使用取反运算符来将另一个 int4 向量 neg_i4 的值初始化为 -1、-2、-3 和 -4。
int4 pos_i4 = int4(1, 2, 3, 4);
int4 neg_i4 = -pos_i4;
| 运算符 | 说明 | 适用于 |
|---|---|---|
| +、-、*、/ | 算术运算符 | all |
| =、+=、-=、*=、/=、 | 赋值运算符 | 整数、浮点 |
| % | 模数运算符 | 整数 |
| &、|、^、<<、>> | 按位运算符 | 整数 |
| &=、|=、^=、<<=、>>= | 按位复合赋值运算符 | 整数 |
| >、>=、==、!=、<=、< | 关系运算符 | 整数、浮点 |
| &&、|| | 逻辑运算符。请注意,不支持 &&= 和 ||=。 | 整数、浮点 |
与对标量值的运算不同,向量上的运算不会执行常见的算术转换。例如,如果添加两个 char 类型的向量,结果是 char 类型的向量,而不是 int 类型的向量。
对于所有运算符,每个输入向量必须具有与其他输入相同的元素计数和类型。生成的向量将具有与输入相同的元素计数。对于算术运算符,结果与输入向量具有相同的类型。对于逻辑和比较运算符,结果具有与输入向量元素大小相同的整数元素。例如,(float4==float4) 给出 int4,double8==double8 给出 longlong8。向量二进制逻辑运算符结果的每个通道都是全位集(-1)(表示 true)或0 (表示 false)。
下面的示例在类型为 int4 的向量上使用 =、++ 和 + 运算符。假定 iv4 参数最初包含 (1, 2, 3, 4)。在退出 foo() 时,iv4 将包含 (3, 4, 5, 6)。
void foo(int4 iv4)
{
int4 local_iva = iv4++; /* local_iva = (1, 2, 3, 4) */
int4 local_ivb = iv4++; /* local_ivb = (2, 3, 4, 5) */
int4 local_ivc = local_iva + local_ivb; /* local_ivc = (3, 5, 7, 9) */
}
算术运算符和增量/减量运算符可以与复数向量类型搭配使用。增量/减量运算符会加上或减去 1+0i。
下面的示例中将类型为 cfloat2 的复数向量相乘和相除。如需详细了解复数乘法和除法的规则,请参阅《C99 C 语言规范》的“附件 G”。
void foo()
{
cfloat2 va = cfloat2 (1.0, -2.0, 3.0, -4.0);
cfloat2 vb = cfloat2 (4.0, -2.0, -4.0, 2.0);
/* vc = (0.0, -10.0), (-4.0, 22.0) */
cfloat2 vc = va * vb;
/* vd = (0.4, -0.3), (-1.0, 0.5) */
cfloat2 vd = va / vb;
...
}
在 C64+ 和 C6740 上,前面示例中的 * 和 / 运算符会调用一个内置函数来执行复数乘法和除法运算。在 C6600 上,编译器会生成一个 CMPYSP 指令来执行复数乘法或除法运算。