2013-02-07 2 views
0

부호있는 짧은 부호있는 부호있는 부호로 변환하려면 항상 32768을 뺍니다.효율적으로 부호없는 부호로 변환

가장 빠르지 않습니까? 더 빠른 방법이 있습니까?

+0

는 심지어 * * 정확한 방법이다! 만약 내가'0'을 변환하고 싶다면, 당신의 계획에 따라'-32768'로 끝날까요? –

+1

예, 이제 -32767이됩니다. 훨씬 낫다. –

+1

귀하는 "변환"이 귀하에게 의미하는 바를 알려 주셔서 깜빡하셨습니다. –

답변

1

값이 0에서 SHRT_MAX (포함) 사이 인 경우 캐스팅 ((short))은 선택적입니다 (컴파일러가 편집증이거나 편집증 환자가 아닌 경우). unsigned short 값이 SHRT_MAX보다 클 경우

, short로 변환하는 유일한 합법적 인 방법에 관한 것입니다 : 이것은 물론, SHRT_MIN = 2의 보수 인 서명 반바지에 의존

#include <limits.h> 

short ushort2short(unsigned short s) 
{ 
    if (s <= SHRT_MAX) 
    return s; // or return (short)s; 
    s -= SHRT_MAX + 1; // now s is 0 ... SHRT_MAX 
    return (short)s - SHRT_MAX - 1; 
} 

-SHRT_MAX - 1

최신 컴파일러는이 함수 내부의 모든 말도 안되는 부분을 최적화하고 s을 반환하는 코드 만 생성합니다.

EDIT :이 어셈블리 코드 gcc -Wall ush2sh.c -O2 -S -o ush2sh.s 등 GCC 4.6.2와 위의 집계 :

 .file "ush2sh.c" 
     .text 
     .p2align 2,,3 
     .globl _ushort2short 
     .def _ushort2short; .scl 2;  .type 32;  .endef 
_ushort2short: 
LFB0: 
     .cfi_startproc 
     movl 4(%esp), %eax 
     ret 
     .cfi_endproc 
LFE0: 
+0

마지막 문장이 확실하지 않습니다. 그것은 컴파일러에게 많은 것을 요구합니다. 해체를 보셨습니까? – Mysticial

+0

@ 신비로운 예, 편집을 참조하십시오. –

+0

와우, 감동했습니다 ... 다시 한번 살펴 보았습니다. 컴파일러가 표준 최적화 과정만으로도이를 수행 할 수있는 방법을 알 수 있습니다. 언뜻보기에는 많은 컴파일러에서 부족한 데이터 범위 분석이 필요할 것입니다. – Mysticial

관련 문제