从unsigned long int转换为signed int,反之亦然
我想将一个signed int传递给gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)
。 我传递的signed int大于或等于零。 该函数将返回一个介于0
和n
之间的数字,因此如果我传递一个正的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 long
, unsigned int
, unsigned short
和unsigned char
,标准保证。
如果传递一个有signed
但是负数的int
,则无法获得正确的结果,因为它将被函数计算为一个非常大的int。
最好的方法是在传递之前检查signed int是否>= 0
。
我希望我能正确理解你的问题。