从unsigned long int转换为signed int,反之亦然

时间:2011-07-27 16:45:15

标签: c int long-integer unsigned signed

我想将已签名的int传递给gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)。我传递的signed int大于或等于零。该函数将返回0n之间的数字,因此如果我传递一个正的signed int,它将返回一个在signed int范围内的内容。然后我想将返回值存储在signed int中。用明显的预期行为来做到这一点的最干净的方法是什么?我在64位Linux机器上使用64位编译器。

更新 对不起,伙计们。请忽略。我的代码的问题实际上在其他地方。我误解了gdb的输出。

2 个答案:

答案 0 :(得分: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,那么测试输入就足够了。

[编辑:哇,谷歌非常积极地索引SO。我只是搜索检查gsl_rng_uniform_signed是否已经是一个函数,并找到了自己。]

答案 1 :(得分:1)

如果函数需要unsigned long,您可以通过unsigned longunsigned intunsigned shortunsigned char毫无问题地通过,标准可以保证。

如果你传递的是signed但是int,那么你将无法获得正确的结果,因为它将被函数评估为一个非常大的int。

最好的方法是在传递之前检查signed int是否为>= 0

我希望我能正确理解你的问题。