2015-07-20 72 views
3

該API提供了一個函數signed char getDirection();,返回1表示「forward」,0表示「不動」,-1表示「後退」。如何將Signed Char與文字常量進行比較?

,當然還有,在thesequestions解釋,一個簡單的比較:

if(getDirection() == -1) { ... } 

失敗。好吧,我明白爲什麼它會失敗。但我無法找到如何使其工作!我嘗試了左側鑄造(int),右側(signed char),還是虛無縹緲......

編輯:

signed char a = getDirection(); 
printf("%d\n",(int) a); 
printf("%d\n",(int) getDirection()); 

結果:

-1 
255 

EDIT2:每個請求:

const signed char getDirection(uchar d) 
{ 
    if(d >= config.directional_inputs.channelCount) return -2; 

    return shm->input_state.directional_inputs[d].direction; 
} 
+0

@AlexD:我希望。那麼,實際上測試語句的格式爲'printf(「val:%d,compare:%d」,getDirection(),(getDirection()== DIRECTION_BACK));'常量是'#define DIRECTION_BACK -1' –

+3

你的代碼是正確的。檢查getDirection()是否實際返回-1。顯示你的'printf'的輸出。同時顯示你的實際代碼,也許只是一個流浪';'某處。 –

+0

@MichaelWalz:輸出:「val:-1,比較:0」。一位同事懷疑編譯器錯誤。 –

回答

0

如果您確定getDirection()確實返回一個sig ned char,它應該可以工作,因爲0xff的一個有符號字符應該被正確地提升爲-1整數。

如果不確定的話,你可以嘗試寫

int dir = getDirection(); 
// optionnally for extensive tests : fprintf(stderr, "getDirection : %d\n", dir); 
if ((dir == -1) || (dir == 255)) { ... } 

的255會趕上任何轉換問題,例如getDirection()返回一個符號字符...上次編輯建議是什麼?

+0

這是一種破解解決方案... –

+0

@MichaelWalz:就是這樣。但是我曾經不得不使用類似的方式來返回一個'char'的庫,我必須在兩個平臺上使用它,其中char是在一個平面上簽名的,另一個是未簽名的平臺。我已經看到了(寫得很糟的)代碼,其中doc表示'signed char',代碼只包含'char',因爲程序員認爲他的系統上有什麼(char = signed char)是標準的,而標準表示它是執行依賴。 –

+0

@SergeBallesta:我個人的看法是,'char'本身總是意味着一個ASCII字母。如果它是一個數字,它必須表示爲「有符號」或「無符號」。 –

0

它似乎在GetDirection部分return shm->input_state.directional_inputs[d].direction;執行。 direction元素的類型是什麼?我不確定這裏的促銷活動,但如果是unsigned char,它可能只是複製到返回註冊表ax並返回。也就是說,不執行符號擴展,ax是0x000000ffff被分配到signed char a,這是正確的,並且當在printf調用中使用a時,它會得到正確的符號擴展。因此,標誌擴展必須在GetDirection的返回語句中完成,但顯然沒有完成。

嘗試將其更改爲return (signed char)shm->input_state.directional_inputs[d].direction;

+0

'direction'是'signed char''完全相同,它是第一個分配鏈,當輸入端口組合成'反向'配置時,獲得一個文字'-1'。 –

+0

它仍然看起來像'GetDirection'不會做符號擴展。用調試器檢查它。 –

0

這是很奇怪的。

首先,使用不同的編譯器可能會有所作爲。他們可能會有不同的規則,應該如何返回一個簽名字符。假設用於編譯該函數的編譯器假定signed char在32位寄存器中返回8位,其他位爲零或未定義 - 返回-1作爲00000000 00000000 00000000 11111111.調用的編譯器假定signed char在32位寄存器中作爲8位返回,符號擴展,因此可以假設所有32位都包含正確的值。所以編譯器認爲結果是255.

其次,我看到原型和函數不匹配的問題。如果某個地方有一個「char」而不是有符號字符的函數原型,那就可以解釋一切。由於這個問題很奇怪,所以我會要求編譯器提供預處理器輸出,並檢查是否有任何奇怪的事情發生。

+0

對於最近的或體面的編譯器,標準是清晰的6.3.1.1§2-3:*如果一個int可以表示原始類型的所有值(由寬度限制,對於 位字段),則該值被轉換一個int;否則,它被轉換爲一個unsigned int。這些被稱爲整數促銷*和*整數促銷保持價值,包括標誌。正如前面所討論的,一個'純'字符是否被視爲有符號是實現定義的。但是TCC是一致的嗎?和什麼版本的標準? –

相關問題