![](/img/trans.png)
[英]C: Converting unsigned char array to signed int (vice versa)
[英]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大於或等於零。 該函數將返回一個介於0
和n
之間的數字,因此,如果我將其傳遞為正號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 long
, unsigned int
, unsigned short
和unsigned char
,該標准保證了這一點。
如果傳遞一個帶signed
但為負的int
,則將不會獲得正確的結果,因為該函數會將它評估為一個很大的int。
最好的方法是在傳遞前檢查帶符號的int是否>= 0
。
希望我能正確理解您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.