![](/img/trans.png)
[英]C: Converting unsigned char array to signed int (vice versa)
[英]Converting from unsigned long int to signed int and vice versa
我想将一个有符号的int传递给gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)
。 我要传递的带符号int大于或等于零。 该函数将返回一个介于0
和n
之间的数字,因此,如果我将其传递为正号int,它将返回一个在正负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
那么测试输入就足够了。
[编辑:哇,Google确实对索引进行了积极地索引。 我只是搜索以确认gsl_rng_uniform_signed
是一个函数,然后发现了我自己。]
如果函数期望unsigned long
unsigned long
unsigned int
,则可以毫无问题地传递unsigned long
, unsigned int
, unsigned short
和unsigned char
,该标准保证了这一点。
如果传递一个带signed
但为负的int
,则将不会获得正确的结果,因为该函数会将它评估为一个很大的int。
最好的方法是在传递前检查带符号的int是否>= 0
。
希望我能正确理解您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.