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

标签 c int long-integer unsigned signed

我想将一个有符号整数传递给 gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)。我传递的 signed int 大于或等于零。该函数将返回一个介于 0n 之间的数字,因此如果我向它传递一个带正符号的 int,它将返回一个在 signed 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,那么测试输入就足够了。

[编辑:哇,谷歌索引如此积极。我只是搜索以检查 gsl_rng_uniform_signed 是否已经是一个函数,然后发现了自己。]

关于从 unsigned long int 转换为 signed int,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6848124/

相关文章:

c - 如何在 C 中将 char 数组转换为变量 long?

java - 如何在 Java 和 PostgreSQL 中处理 32 位数字?

c - 不允许的复合表达式转换(目标的更广泛的基本类型)堆栈溢出

c - 在 OSX 10.12 上使用 mmap() 时出现 'cannot allocate memory' 错误

c - 短与 Int Gcc

c - 为什么用int错误,但long long对

c - 为什么这不能在 C18 中编译?

c - 使文本在 x 秒后消失 [C]

MySQL AVG() 的 varchar 可能吗?

c# - 8 位和 16 位整数的算术运算