Opencl 嵌套式as_类型转换
当我将OpenCL的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
嵌套为_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