当我有一个要转换为有符号的无符号短时,我总是减去 32768。
这是最快的方法,还是有更快的方法?
如果该值介于 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: