ちょうど今CUDAカーネルを書いている間、私は次のコードの結果をテストする機会がありました:
unsigned char temp1 = 0x00;
unsigned char temp2 = 0x00;
unsigned char temp3 = temp1/temp2;
printf("%02X", temp3);`
このコードは「0xFF」を出力します。私はこれに非常に困惑しています、誰かが説明を提供できますか?
ちょうど今CUDAカーネルを書いている間、私は次のコードの結果をテストする機会がありました:
unsigned char temp1 = 0x00;
unsigned char temp2 = 0x00;
unsigned char temp3 = temp1/temp2;
printf("%02X", temp3);`
このコードは「0xFF」を出力します。私はこれに非常に困惑しています、誰かが説明を提供できますか?
ゼロによる整数除算の結果は、C /C++標準では定義されていません。次に、C99セクション6.5.5を参照してください。
/演算子の結果は、最初のオペランドを2番目のオペランドで除算した商です。%演算子の結果は剰余です。どちらの操作でも、第2オペランドの値がゼロの場合、動作は未定義です。
ゼロによる除算の場合、NVIDIA GPUの整数除算演算子は、すべてのビットが1に設定された結果を返します。これは、DirectXとの互換性のためである可能性があります。同じことが、除数がゼロのモジュロ演算子にも当てはまります。すべてのオペランドがリテラル定数の場合、コンパイル時にコンパイラオプティマイザによって処理される可能性があるため、異なる結果が発生する可能性があります。
いずれにせよ、CUDAプログラマーは、これらの結果を実装アーティファクトとして確実に扱う必要があります。これは、いつでも未定義の動作に依存することはできないためです。