嵌套的as_type Casting

时间:2013-12-30 10:41:22

标签: opencl

当我嵌套OpenCL的as_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位,所以应该可以重新解释任何东西。

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

1 个答案:

答案 0 :(得分:4)

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

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

您应该可以通过将4290772991更改为4290772991u来解决问题。后缀将明确表示值为无符号,编译器应选择32位无符号整数。或者,您也可以使用0xFFBFFFFF - 十六进制常量有不同的规则,应该从渐进int,然后unsigned int,然后long int分配一个类型,然后最后unsigned long int