ZHCUAU3J January 2018 – March 2024
as_<destination type>(<source type object>) 函数用于将对象的原始类型重新解释为另一种矢量类型。源类型和目标类型的位数必须相同。如果大小不同,则返回错误。
针对不会导致每个元素恰好包含 0x0 或 0x1 的布尔向量,未定义重新解释。下面显示了已定义或未定义结果的示例:
ushort2 myshort2_0 = ushort2(0,1);
bool4 mybool4_0 = as_bool4(myshort2_0); // Defined
ushort2 myshort2_1 = ushort2(2,3);
bool4 mybool4_1 = as_bool4(myshort2_1); // Undefined
bool8 mybool8_0 = bool8(0,1,0,1,0,1,0,1);
float2 myfloat2_0 = as_float2(mybool8_0); // Defined
float2 myfloat2_1 = float2(1.0,2.0);
bool8 mybool8_1 = as_bool8(myfloat2_1); // Undefined
虽然算术转换由上一段中介绍的转换函数执行,但重新解释函数不执行算术转换。例如,假设浮点值 1.0 被重新解释为整数值。浮点值 1.0 以十六进制表示为 0x3f800000,由此得到的整数值为 1,065,353,216。
以下示例将 long 类型(64 位)的非矢量变量重新解释为 float2 矢量(2 个元素,每个元素 32 位)。mylong 的最低有效 32 位放在 fltvec2.s0 中,而 mylong 的最高有效 32 位放在 fltvec2.s1 中。不执行算术转换。
extern long mylong;
float2 fltvec2 = as_float2(mylong);
如果源类型和目标类型的大小不同,则会发生错误。
如果启用了矢量数据类型,还可以对标量(非矢量)类型使用 as_<type>() 函数。类型必须具有相同的位数。以下示例将浮点值重新解释为整数值。浮点值 1.0 以十六进制表示为 0x3f800000,由此得到的整数值为 1,065,353,216。
float myfloat = 1.0f;
myint = as_int(myfloat);