0
A
답변
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:
관련 문제
- 1. 부호있는 부호없는 부호로 또는 부호 부호로 변환하기
- 2. 부호없는 short를 char *로 효율적으로 변환 *
- 3. 부호없는 char 배열을 int로 부호없는 문자로 변환
- 4. int를 문자열로 효율적으로 변환
- 5. NSString을 부호없는 길이로 변환
- 6. C에서 부호없는 char로 변환
- 7. CString을 부호없는 long으로 변환
- 8. BCD를 부호없는 char으로 변환
- 9. 부호없는 int 변환 C++
- 10. 배열을 부호없는 정수로 변환
- 11. 부호없는 정수 변환 VHDL
- 12. 3 바이트 부호없는 숫자를 효율적으로 정렬
- 13. C++ : T에서 부호없는 T로 변환
- 14. MFC CString을 부호없는 정수로 변환
- 15. 문자열 (substr에서) 부호없는 int로 변환
- 16. 포인터 산술 & 부호있는/부호없는 변환!
- 17. C에서 부호가있는 부호없는 정수로 변환
- 18. 부호없는 문자 배열을 정수로 변환
- 19. JNI : 부호없는 int를 jint로 변환
- 20. 벡터 <부호없는 문자>를 const 부호없는 문자로 변환 *
- 21. SDL_Surface에서 QPixmap으로 효율적으로 변환
- 22. 효율적으로 배열 변환 (PHP)
- 23. 문자열 목록을 효율적으로 float32로 변환
- 24. multiset을 효율적으로 설정하여 집합으로 변환
- 25. bijection을 사이클 표기법으로 효율적으로 변환
- 26. OpenGL : 효율적으로 변환 행렬을 계산합니다.
- 27. 효율적으로 바이트 배열을 십진수로 변환
- 28. 16 진수 문자열을 부호없는 길이로 변환
- 29. 이진 부호없는 벡터를 dec 목록으로 변환
- 30. 부호없는 long long에서 unsigned int로 변환
는 심지어 * * 정확한 방법이다! 만약 내가'0'을 변환하고 싶다면, 당신의 계획에 따라'-32768'로 끝날까요? –
예, 이제 -32767이됩니다. 훨씬 낫다. –
귀하는 "변환"이 귀하에게 의미하는 바를 알려 주셔서 깜빡하셨습니다. –