署名されたショートに変換したい署名されていないショートがある場合は、常に32768を減算します。
それを行うための最速の方法ですか、それともより速い方法がありますか?
署名されたショートに変換したい署名されていないショートがある場合は、常に32768を減算します。
それを行うための最速の方法ですか、それともより速い方法がありますか?
値が 0 からSHRT_MAX
(0 を含む) の間であれば、心配する必要はなく、キャスト ( (short)
) はオプションです (コンパイラが偏執的であるか、偏執的になるように構成されていない限り)。
unsigned short
値が より大きい場合、SHRT_MAX
それを変換する唯一の合法的な方法short
は次のとおりです。
#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_MIN
もちろん、これは、 = - SHRT_MAX
- 1の 2 の補数である符号付き short に依存しています。
最新のコンパイラは、この関数内のナンセンスをすべて最適化し、コードを生成して を返しs
ます。
EDITgcc -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: