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

我想将一个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的输出。

从…开始:

 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是否已经是一个函数,并找到了自己。]

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

如果传递一个有signed但是负数的int ,则无法获得正确的结果,因为它将被函数计算为一个非常大的int。

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

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