我想将一个有符号整数传递给 gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)
。我传递的 signed int 大于或等于零。该函数将返回一个介于 0
和 n
之间的数字,因此如果我向它传递一个带正符号的 int,它将返回一个在 signed 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
,那么测试输入就足够了。
[编辑:哇,谷歌索引如此积极。我只是搜索以检查 gsl_rng_uniform_signed
是否已经是一个函数,然后发现了自己。]
关于从 unsigned long int 转换为 signed int,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6848124/