ここではVisualC++ 2008(9.x)を使用しており、IDIVではなくDIVを生成するコンパイラーに遭遇したときに固定小数点値を準備していました。コードを小さな断片に折りたたんで、正確に再現しました。
short a = -255;
short divisor16 = 640; // unsigned, 16-bit
unsigned int divisor32 = 640; // unsigned, 32-bit
unsigned short s_divisor16 = 640; // signed, 16-bit
int s_divisor32 = 640; // signed, 32-bit
int16_t test1 = (a<<8)/divisor16; // == -102, generates IDIV -> OK
int16_t test2 = (a<<8)/s_divisor16; // == -102, generates IDIV -> OK
int16_t test3 = (a<<8)/divisor32; // == bogus, generates DIV -> FAIL!
int16_t test4 = (a<<8)/s_divisor32; // == -102, generates IDIV -> OK
int bitte_ein_breakpoint=1;
簡単な分解で煩わされることはありません。
ショートカットを使用して除数の型(関数パラメーター、unsigned int numPixels)を変更する代わりに、3番目の(test3)の場合、コンパイラーがIDIVよりもDIVを選択するのはなぜですか?符号なし16ビット除数であり、とにかく符号なし演算を必要とするものは実際にはありません。少なくともそれは私が思うことであり、私が間違っていることを願っています:)