int isNegative(int x) {
return ((unsigned) x)>> 31;
}
我正在寫一個函數,它需要32位並返回1,如果x < 0,否則返回0。如何在不投射的情況下將帶符號的int轉換爲無符號的int。從signed int轉換爲unsigned int而不鑄造
int isNegative(int x) {
return ((unsigned) x)>> 31;
}
我正在寫一個函數,它需要32位並返回1,如果x < 0,否則返回0。如何在不投射的情況下將帶符號的int轉換爲無符號的int。從signed int轉換爲unsigned int而不鑄造
你的問題是寫一個函數,採用32位和返回1
如果x < 0
int isNegative(int x) {
return x < 0;
}
這無論什麼int
大小工作,並沒有調用任何類型轉換。我想你已經想到了這個問題。
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 int
到unsigned int
沒有鑄造。
簡單賦值
int i;
unsigned u = i;
試圖使用>>
來合併這兩個風險實現定義的行爲,應該避免,除非不得已的原因給出。
示例實現定義的行爲的一個示例是當有符號整數右移時高位傳播。 C11§3.4.22
執行自動類型轉換的操作有多種,其中包括賦值,特定條件下的算術運算和函數調用(轉換某些參數值)。
因此,你可以簡單地通過聲明爲參數類型實現的(signed
)int
參數unsigned int
轉換:
int isNegative(unsigned x) {
return x >> 31;
}
不可否認,但是,功能界面可能是一個有點混亂。因此,你可能更喜歡這樣做:
int isNegative(int x) {
unsigned ux = x;
return x >> 31;
}
不過,我不認爲這類原因是因爲你原來的版本一樣清楚,與鑄造。類型轉換是演員的全部目的,當轉換是你需要的(以及你需要的)時,演員就是這個工作的正確工具。
當然,我總體上喜歡@chux建議的更簡單的方法族。
不清楚爲什麼代碼不是簡單的'return x <0',因爲它符合更高層次的目標「如果x <0則返回1,否則返回0」。當然,這不能回答較低的目標 - 我覺得有點不清楚。 – chux
如果你想讓你的函數採用32位數據類型,那是一個「long」而非int。 – Fredrik
爲什麼你需要轉換而不鑄造?這就是鑄造*爲*的原因。 –