c-如何将两个数字组合得到一个长整数



我正试图将两个大数字组合在一起,这将导致一个";long-long-int";。例如:

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

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

我知道你们大多数人都在想;你到底为什么要那样做&";。当我说有理由这么做的时候,你必须相信我。

需要了解的详细信息:

  • 变量a预计为10位,因此我将其定义为";"长";整数只是为了安全起见。它可以是负数,也可以是正数
  • 变量b将是时间函数的值的最后8位。这意味着变量b有机会等于00000000。这个数字永远是正数
  • 变量z将是变量ab的组合。它必须是一个";long-long-int";。变量a将始终位于变量b之前。如果变量b等于00000000,那么我希望在变量z中实现:-17166297200000000或-1716629700000001,等等

我已经尝试设置";长-长z";等于(a*100000000(+b,但我最终得到了一些疯狂的数字。这也会发出溢出的警告。我认为这与整数类型有关。任何帮助都将不胜感激。谢谢

如果a不够大,无法容纳生成的类型,那么简单地执行(a*100000000)+b可能会溢出。long long保证保持有符号的64位数量,因此在执行计算之前将a强制转换为该类型。

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

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

我最终使用了以下代码:

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);

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

如果这是一种处理时间戳的安排,精度为10^8的一部分,那么最好是将结构struct my_time中的两个量都作为进行管理

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

但IMHO,你应该最好用2的逆幂来表示一秒的分数,因为这只代表一项乏味的任务,要转换成十进制(这是你只有在输出或输入到计算机时才会做的事情,而在进行计算时永远不会做(。例如,NTP就是这样描述其时间戳的。如果你决定使用NTP(互联网中的标准格式(,我可以给你一个存储在我的git存储库中的示例实现。你可以在这里找到它(你需要阅读代码才能理解它,但它在1900年1月1日给出了大约232 ps的分辨率和历元(

最新更新