2013-02-07 108 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

相關問題