署名されたショートに変換したい署名されていないショートがある場合は、常に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: