저는 Visual C++ 2008 (9.x)에서 작업하고 있고 DIV 대신에 DIV를 생성하는 컴파일러를 실행할 때 고정 소수점 값을 준비했습니다. IDIV. 코드를 정확히 재현 할 수있는 작은 조각으로 접었습니다.Visual C++은 IDIV (x86, 정수 산술) 대신 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;
나는 간단한 분해로 당신을 괴롭히지 않을 것입니다.
이제는 바로 가기를 사용하지 않고 divisor의 형식 (함수 매개 변수 인 unsigned int numPixels)을 변경하는 대신 컴파일러에서 세 번째 (test3) 경우에 DIV를 선택하는 것이 궁금합니다. 서명되지 않은 16 비트 제수로 그렇게하라. 어쨌든 부호없는 산술을 요구할만한 것은 실제로 없다. 적어도 그것은 내가 생각하는 바이며 나는 틀렸다고 희망한다.
Shift는 앞서 말했듯이 산술 대신 논리 인 SHL 명령어를 생성합니다. 그것은 틀린 것처럼 보이지만 * 256은이 부분에서 정확히 동일합니다. – nielsj