簡體   English   中英

從unsigned long int轉換為signed int,反之亦然

[英]Converting from unsigned long int to signed int and vice versa

我想將一個有符號的int傳遞給gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n) 我要傳遞的帶符號int大於或等於零。 該函數將返回一個介於0n之間的數字,因此,如果我將其傳遞為正號int,它將返回一個在正負int范圍內的值。 然后,我想將返回值存儲在一個有符號的int中。 用明顯的預期行為執行此操作的最干凈方法是什么? 我在64位Linux機器上使用64位編譯器。

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

從...開始:

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那么測試輸入就足夠了。

[編輯:哇,Google確實對索引進行了積極地索引。 我只是搜索以確認gsl_rng_uniform_signed是一個函數,然后發現了我自己。]

如果函數期望unsigned long unsigned long unsigned int ,則可以毫無問題地傳遞unsigned longunsigned intunsigned shortunsigned char ,該標准保證了這一點。

如果傳遞一個帶signed但為負的int ,則將不會獲得正確的結果,因為該函數會將它評估為一個很大的int。

最好的方法是在傳遞前檢查帶符號的int是否>= 0

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM