【问题标题】:How to combine two numbers to get a long long integer?如何组合两个数字以获得一个长整数?
【发布时间】:2022-02-02 20:36:10
【问题描述】:

我正在尝试将两个大数组合在一起,这将导致“long long int”。例如:

a = -1716642972;
b = 43828807;
z = a and b;

在这种情况下,我希望 z 等于 -171664297243828807。

我知道你们中的大多数人都在想,“你们到底为什么要这样做?”。当我说有理由想要这样做时,你只需要相信我。

了解详情:

  • 变量 a 预计为 10 位数字,因此我将其定义为“长”整数。只是为了安全起见。它可以是负数或正数。
  • 变量 b 将是 time 函数中 seconds 值的最后 8 位数字。这意味着变量 b 有可能等于 00000000。该数字始终为正数。
  • 变量 z 将是变量 ab 的组合。它必须是“long long int”。变量 a 总是在变量 b 之前。如果变量 b 等于 00000000,那么我希望在变量 z 中实现:-171664297200000000 或 -171664297200000001 等...

我尝试将“long long z”设置为等于 (a*100000000)+b,但我最终得到了一些疯狂的数字。这也给出了溢出的警告。我假设这与整数类型有关。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • a 乘以100000000。如果a 为负数,则将b 乘以-1。将这两个值相加。
  • 确保在进行计算之前将ab 转换为long long。否则计算将使用long 值完成,并且会溢出。
  • 创建一个函数来计算 b 的长度,将 a 乘以 10^len(b),然后将 b 添加(或减去,取决于 a 的符号)到新的 a。确保 a 和 b(以及 sum)变量都是 long long。
  • 你需要考虑a的符号。它总是消极的吗?
  • 只需将100000000 更改为100000000LL 应该会有所帮助。

标签: c integer concatenation long-integer long-long


【解决方案1】:

如果a 不足以容纳结果类型,则只需执行(a*100000000)+b 就会溢出。 long long 保证包含有符号的 64 位数量,因此在执行计算之前将 a 转换为该类型。

另外,如果a 是负数,那么您首先需要在添加之前反转b 的符号。

long long z = (long long)a * 100000000 + (a>=0 ? b : -b);

【讨论】:

    【解决方案2】:

    我最终做的是使用以下代码:

    long a = -1716642972;
    int b = 43828807;
    
    // combine a and b as a string. Be sure to specify variable types.
    char string[20];
    snprintf(string, 20, "%ld%i", a, b);
    
    //convert the string into a long long (%lld)
    long long z;
    sscanf(concat, "%lld", &z);
    

    虽然这可能是一个较长的过程,但它完成了工作。从好的方面来说,通过这个过程,我不需要对整数类型挑剔,只要我指定这些类型是什么。

    【讨论】:

      【解决方案3】:

      如果这是一种以 10^8 分之一的精度处理时间戳的安排,那么最好的办法是在结构 struct my_time as 中管理这两个数量

      struct my_time {
          unsigned long mt_sec; /* 0..UINT_MAX */
          unsigned int mt_tens_of_nanosec;  /* 0..99999999 */
      };
      

      但是恕我直言,您最好使用 2 的反幂来表示秒的几分之一,因为这仅表示要转换为十进制的繁琐任务(只有在输出或输入到计算机,并且永远不会在进行计算时)。例如,这就是 NTP 描述其时间戳的方式。如果您决定使用 NTP(互联网中的一种标准格式),我可以为您提供存储在我的一个 git 存储库中的示例实现。你可以找到它here(你需要阅读代码才能理解它,但它提供了大约 232 ps 的分辨率,一个纪元在 1900 年 1 月 1 日)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多