Opencl 嵌套式as_类型转换

Opencl 嵌套式as_类型转换,opencl,Opencl,当我将OpenCL的嵌套为_type操作符时,会出现一些奇怪的错误。例如,这一行可以工作: a = as_uint(NAN)&4290772991; 但这些线路不起作用: a = as_float(as_uint(NAN)&4290772991); a = as_uint(as_float(as_uint(NAN)&4290772991)); 错误内容如下: invalid reinterpretation: sizes of 'float' and 'lon

当我将OpenCL的
嵌套为_type
操作符时,会出现一些奇怪的错误。例如,这一行可以工作:

 a = as_uint(NAN)&4290772991;
但这些线路不起作用:

 a = as_float(as_uint(NAN)&4290772991);

 a = as_uint(as_float(as_uint(NAN)&4290772991));
错误内容如下:

invalid reinterpretation: sizes of 'float' and 'long' must match
此错误消息令人困惑,因为此代码似乎没有创建任何
long
。这里的所有值都是32位,因此应该可以重新解释强制转换任何内容


那么为什么会发生这种错误呢?

在C99中,未修饰的十进制常量被假定为有符号整数,编译器将自动将该常量定义为最小的有符号整数类型,该类型可以使用级数
int
保存值,然后是
long int
,最后是
unsigned long int

可容纳
4290772991
的最小有符号整数类型是64位有符号类型(因为需要符号位)。因此,当重新解释类型为32位类型时,
as_type
调用失败,因为编译器为常量选择的64位
long int
与目标
float
类型之间的大小不匹配


通过将
4290772991
更改为
4290772991u
,您应该能够绕过此问题。后缀将显式地将值表示为无符号,编译器应选择一个32位无符号整数。或者,您也可以使用
0xffbffff
——十六进制常量有不同的规则,应该从C99中的级数
int
分配一个类型,然后
unsigned int
,然后
long int
,最后是
unsigned long int
,未修饰的十进制常量被假定为有符号整数,编译器将自动将该常量定义为最小的有符号整数类型,该类型可以使用级数
int
,然后
long int
,最后
unsigned long int

可容纳
4290772991
的最小有符号整数类型是64位有符号类型(因为需要符号位)。因此,当重新解释类型为32位类型时,
as_type
调用失败,因为编译器为常量选择的64位
long int
与目标
float
类型之间的大小不匹配

通过将
4290772991
更改为
4290772991u
,您应该能够绕过此问题。后缀将显式地将值表示为无符号,编译器应选择一个32位无符号整数。或者,您也可以使用
0xffbffff
——十六进制常量有不同的规则,应该从级数
int
中为其分配一个类型,然后
无符号int
,然后
长int
,最后
无符号长int