1

刚才写CUDA内核的时候,有机会测试一下下面代码的结果:

unsigned char temp1 = 0x00;
unsigned char temp2 = 0x00;
unsigned char temp3 = temp1/temp2;

printf("%02X", temp3);`

此代码打印“0xFF”。我对此感到非常困惑,有人可以解释一下吗?

4

1 回答 1

8

根据 C/C++ 标准,整数除以零的结果是未定义的。参见 C99 第 6.5.5 节,例如:

/ 运算符的结果是第一个操作数除以第二个操作数的商;% 运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为未定义

在除以零的情况下,NVIDIA GPU 上的整数除法运算符返回所有位设置为 1 的结果。这可能是为了与 DirectX 兼容。这同样适用于除数为零的模运算符。当所有操作数都是文字常量时,您可能会观察到不同的结果,因为这些情况可能由编译器优化器在编译时处理。

无论如何,CUDA 程序员绝对应该将这些结果视为实现工件,因为任何时候都不能以任何方式依赖未定义的行为。

于 2012-10-18T23:01:30.877 回答