【问题标题】:Converting from unsigned long int to signed int and vice versa从无符号长整数转换为有符号整数,反之亦然
【发布时间】:2011-10-14 10:57:20
【问题描述】:

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

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

【问题讨论】:

    标签: c int long-integer unsigned signed


    【解决方案1】:

    如果函数需要unsigned long,您可以毫无问题地传递unsigned longunsigned intunsigned shortunsigned char,标准保证了这一点。

    如果你传递了一个signed 但否定的int,你将不会得到正确的结果,因为它会被函数计算为一个非常大的int。

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

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

    【讨论】:

      【解决方案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 还不是一个函数,然后发现了我自己。]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-23
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多