当我嵌套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位,所以应该可以重新解释任何东西。
那么为什么会发生这种错误?
答案 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
。