首页 文章

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

提问于
浏览
0

我想将一个带符号的int传递给 gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n) . 我传递的signed int大于或等于零 . 该函数将在 0n 之间返回一个数字,所以如果我传递一个正的signed int,它将返回一个在signed int范围内的东西 . 然后我想将返回值存储在signed int中 . 什么's the cleanest way to do this with the obvious expected behaviour? I'm在64位Linux机器上的64位编译器上 .

Update 抱歉,伙计们 . 请忽略 . 我的代码问题其实在其他地方 . 我误解了 gdb 的输出 .

2 回答

  • 2

    如果函数需要 unsigned long ,你可以传递没有问题 unsigned longunsigned intunsigned shortunsigned char ,标准保证 .

    如果传递 signed 但负 int ,则无法获得正确的结果,因为它将被函数计算为非常大的int .

    最好的方法是在传递之前检查signed int是否为 >= 0 .

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

  • 1

    从...开始:

    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 还不是一个函数,并找到了自己 . ]

相关问题