2016-09-18 101 views
0
int isNegative(int x) { 
    return ((unsigned) x)>> 31; 
} 

我正在寫一個函數,它需要32位並返回1,如果x < 0,否則返回0。如何在不投射的情況下將帶符號的int轉換爲無符號的int。從signed int轉換爲unsigned int而不鑄造

+4

不清楚爲什麼代碼不是簡單的'return x <0',因爲它符合更高層次的目標「如果x <0則返回1,否則返回0」。當然,這不能回答較低的目標 - 我覺得有點不清楚。 – chux

+1

如果你想讓你的函數採用32位數據類型,那是一個「long」而非int。 – Fredrik

+3

爲什麼你需要轉換而不鑄造?這就是鑄造*爲*的原因。 –

回答

0

在這種情況下,你不需要。如果你擺脫了劇組,右移保留了符號位。

假設int是32位,刪除轉換結果的結果是負數爲-1,非負數爲0。雖然實際返回值在非負情況下有所不同,但在布爾上下文中,它將按照您的預期工作。

+2

詳細信息:「結果-1爲負數,0爲非負」是_very_ common但實現定義的行爲。 – chux

+0

答案是有限制的,但DV過多。 – chux

0

你的問題是寫一個函數,採用32位和返回1如果x < 0

int isNegative(int x) { 
    return x < 0; 
} 

這無論什麼int大小工作,並沒有調用任何類型轉換。我想你已經想到了這個問題。

3

OP具有不同隱含問題

這需要32位,並返回1,如果x < 0,否則爲0的函數。

int isNegative(int x) { 
    return x < 0; 
} 
// or maybe return bool/_Bool 
bool isNegative(int x) { 
    return x < 0; 
} 
// or pedantically 
int isNegative(int_least32_t x) { 
    return x < 0; 
} 
// or pedantically and nearly universally portable, 
int isNegative(int32_t x) { 
    return x < 0; 
} 

從符號整數到unsigned int的轉換而無需進行轉換(和)
如何轉換signed intunsigned int沒有鑄造。

簡單賦值

int i; 
unsigned u = i; 

試圖使用>>來合併這兩個風險實現定義的行爲,應該避免,除非不得已的原因給出。

示例實現定義的行爲的一個示例是當有符號整數右移時高位傳播。 C11§3.4.22

0

執行自動類型轉換的操作有多種,其中包括賦值,特定條件下的算術運算和函數調用(轉換某些參數值)。

因此,你可以簡單地通過聲明爲參數類型實現的(signedint參數unsigned int轉換:

int isNegative(unsigned x) { 
    return x >> 31; 
} 

不可否認,但是,功能界面可能是一個有點混亂。因此,你可能更喜歡這樣做:

int isNegative(int x) { 
    unsigned ux = x; 
    return x >> 31; 
} 

不過,我不認爲這類原因是因爲你原來的版本一樣清楚,與鑄造。類型轉換是演員的全部目的,當轉換是你需要的(以及你需要的)時,演員就是這個工作的正確工具。

當然,我總體上喜歡@chux建議的更簡單的方法族。

相關問題