当我有一个未签名的短片我想要转换为有符号的短片时,我总是减去32768。
这是最快的方式,还是有更快的方式?
答案 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: