0

署名されたショートに変換したい署名されていないショートがある場合は、常に32768を減算します。

それを行うための最速の方法ですか、それともより速い方法がありますか?

4

1 に答える 1

1

値が 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:
于 2013-02-07T17:27:26.743 に答える