繁体   English   中英

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

[英]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大于或等于零。 该函数将返回一个介于0n之间的数字,因此,如果我将其传递为正号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 longunsigned intunsigned shortunsigned char ,该标准保证了这一点。

如果传递一个带signed但为负的int ,则将不会获得正确的结果,因为该函数会将它评估为一个很大的int。

最好的方法是在传递前检查带符号的int是否>= 0

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM