有效地将unsigned转换为signed

时间:2013-02-07 17:14:03

标签: c optimization casting c99

当我有一个未签名的短片我想要转换为有符号的短片时,我总是减去32768。

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

1 个答案:

答案 0 :(得分: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;
}

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

现代编译器将优化此函数中的所有废话,并生成返回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: