2013-02-07 68 views
0

当我有一个无符号短符号时,我总是减去32768,我想转换为有符号的短符号。有效地将无符号数转换为有符号数

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

+0

是,即使是*正确*的方式?如果我想转换'0',那么通过你的方案,我最终用'-32768'? –

+1

是的,现在你得到-32767。好多了。 –

+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: 
+0

我不确定你最后一句话。这是来自编译器的很多问题。你看过拆卸吗? – Mysticial

+0

@Mysticial是的,请参阅编辑。 –

+0

哇,我留下了深刻的印象......现在我再看一遍,我可以看到编译器如何通过标准优化过程来实现它。乍一看,它看起来需要数据范围分析,这是许多编译器缺乏的。 – Mysticial

相关问题