0

当我有一个要转换为有符号的无符号短时,我总是减去 32768。

这是最快的方法,还是有更快的方法?

4

1 回答 1

1

如果该值介于 0 到SHRT_MAX(含)之间,则无需担心并且强制转换 ( (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;
}

当然,这依赖于签名短裤是 2 的补码SHRT_MIN= - SHRT_MAX- 1。

现代编译器会优化掉这个函数内部的所有废话,只生成代码来返回s

编辑:用 gcc 4.6.2 编译了上面的gcc -Wall ush2sh.c -O2 -S -o ush2sh.s汇编代码:

        .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 回答