2011-07-27 163 views
0

我想將signed int傳遞給gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)。我傳遞的signed int大於或等於零。該函數將返回一個介於0n之間的數字,所以如果我將它傳遞給一個正整數,它將返回一個在有符號整數範圍內的東西。然後我想要將返回值存儲在帶符號的int中。用明顯的預期行爲做到這一點最乾淨的方法是什麼?我在64位Linux機器上使用64位編譯器。從unsigned long int轉換爲signed int,反之亦然

更新 對不起,夥計們。請忽略。我的代碼的問題實際上在其他地方。我誤解了gdb的輸出。

回答

2

開始:

int input = something; 
int result = gsl_rng_uniform_int(r, input); 

有可能的編譯器會發出警告不安全收縮轉換,所以更改爲:

// 0 <= return value < input, so conversion is safe 
int result = (int) gsl_rng_uniform_int(r, input); 

或者安全:

if (input <= 0) { panic(); } 
unsigned long rawresult = gsl_rng_uniform_int(r, input); 
if (rawresult > INT_MAX) { panic(); } 
int result = (int) rawresult; 

這些線可能被包裹在幫手功能中:

int gsl_rng_uniform_signed(const gsl_rng *r, int input) { 
    if (input <= 0) { panic(); } 
    unsigned long rawresult = gsl_rng_uniform_int(r, input); 
    if (rawresult > INT_MAX) { panic(); } 
    return (int) rawresult; 
} 

在任何情況下,測試您的輸入通常比測試您所依賴的函數的輸出更有用,如果您信任gsl_rng_uniform_int,那麼測試輸入就足夠了。

[編輯:哇,谷歌索引真的很積極。我剛剛搜查檢查gsl_rng_uniform_signed已不是一個功能,並發現我自己。]

1

如果函數需要一個unsigned long你可以沒有問題的unsigned longunsigned intunsigned shortunsigned char通,標準保證。

如果您通過signed但負數爲int,您將無法獲得正確的結果,因爲它將通過該函數評估爲非常大的整數。

最好的方法是在通過它之前檢查它是否爲signed。

我希望我能正確理解你的問題。

相關問題