当我想要将一个无符号短整型转换为有符号短整型时,我总是减去 32768。
这是最快的方法吗?还是有更快的方法?
最佳答案
如果该值在 0 到 SHRT_MAX
(含)之间,则无需担心,并且转换 ((short)
) 是可选的(除非您的编译器是偏执或配置为偏执)。
如果无符号短
值可以大于SHRT_MAX
,则将其转换为短
的唯一合法方法是:
#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;
}
当然,这依赖于带符号的 Shorts 是 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:
关于c - 有效地将无符号转换为有符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14756974/