2011-07-27 90 views
0

我想将signed int传递给gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)。我传递的signed int大于或等于零。该函数将返回一个介于0n之间的数字,所以如果我将它传递给一个正整数,它将返回一个在有符号整数范围内的东西。然后我想要将返回值存储在带符号的int中。用明显的预期行为做到这一点最干净的方法是什么?我在64位Linux机器上使用64位编译器。从unsigned long int转换为signed int,反之亦然

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

回答

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,那么测试输入就足够了。

[编辑:哇,谷歌索引真的很积极。我刚刚搜查检查gsl_rng_uniform_signed已不是一个功能,并发现我自己。]

1

如果函数需要一个unsigned long你可以没有问题的unsigned longunsigned intunsigned shortunsigned char通,标准保证。

如果您通过signed但负数为int,您将无法获得正确的结果,因为它将通过该函数评估为非常大的整数。

最好的方法是在通过它之前检查它是否为signed。

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

相关问题