C 如何使用int和float打印大于2^32-1的数字?(这可能吗?)

C 如何使用int和float打印大于2^32-1的数字?(这可能吗?),c,C,如何使用int和float打印大于2^32-1的数字?甚至可能吗?变量如何包含大于2^32-1的数字?简短回答:它可能是一个特定的数据结构和各种各样的函数哦,一个类?这是我们的交易 鉴于这种数据结构,我们如何打印它?使用BigInteger_PrintBigInteger*当然: 实际上,这个问题没有正确的答案,因为打印大于2^32-1的数字完全取决于您存储该数字的方式。如果您谈论的是int64类型,您可以在普通硬件上尝试%I64u、%I64d、%I64x、%llu、%lld最大浮点值是2^12

如何使用int和float打印大于2^32-1的数字?甚至可能吗?

变量如何包含大于2^32-1的数字?简短回答:它可能是一个特定的数据结构和各种各样的函数哦,一个类?这是我们的交易

鉴于这种数据结构,我们如何打印它?使用BigInteger_PrintBigInteger*当然:


实际上,这个问题没有正确的答案,因为打印大于2^32-1的数字完全取决于您存储该数字的方式。

如果您谈论的是int64类型,您可以在普通硬件上尝试%I64u、%I64d、%I64x、%llu、%lld

最大浮点值是2^128-2^104,因此如果它小于此值,您只需将%f或%g或%a与printf一起使用

对于int64类型,JustJeff的答案是正确的

双%f的范围扩展到近2^1024,这真的是相当大;在英特尔硬件上,当长双精度%Lf类型对应于80位浮点时,该类型的范围将上升到2^16384


如果您需要的数字比这个大,您需要使用一个库,它可能有自己的打印例程,或者滚动您自己的表示并提供您自己的打印支持。

更理论上:假设您在某个地方存储了一个非常大的数字;如果是这样的话,我想你可以对这个数字进行数学运算,否则存储它是毫无意义的

如果你能做数学运算,就把这个大数字除以10;把剩下的储存在某处。重复此操作,直到结果小于10。当它小于10时,打印它,然后打印剩余的,从最后一个到第一个。结束

您可以通过除以最大的10次方来加快速度,您可以在32位1'000'000'000上轻松打印10次方

编辑:伪代码:

#include <stdio.h>
#include <math.h>
#include <math_with_very_very_big_num.h>

int main(int argc, char **argv) {
  very_very_big_num bignum = someveryverybignum;
  very_very_big_num quot;
  int size = (int) floor(vvbn_log10(bignum)) + 1;
  char *result = calloc(size, sizeof(char));

  int i = 0;
  do {
    quot = vvbn_divide(bignum, 10);
    result[i++] = (char) vvbn_remainder(bignum, 10) + '0';
    bignum = quot;
  } while (vvbn_greater(bignum,  9));
  result[i] = (char) vvbn_to_i(bignum) + '0';
  while(i >= 0)
    printf("%c", result[i--]);
  printf("\n");
}

我用long写的,而不是用veryverybignum的东西翻译;它与long一起工作,不幸的是,我无法尝试此版本,因此如果我出现了交易错误,请原谅我…

您是指未签名的int或2^31-1。由于符号位的原因,常规有符号整数只能保存2^31-1。我们不要忘记long,它保证至少是32字节,但可以更长,long,它保证至少是64位。我们也不要忘记float只有大约7位小数精度,double大约是15位,long double大约是20位左右。我认为这个问题不是关于32位的;这通常是关于不适合硬件类型的大数字。我不认为问题是关于什么的。我给出了一个解释的答案。我不知道为什么那会得a-1。耸肩如果提问者想澄清,他会得到一个更好的答案。+1,因为如果你知道我的意思,就目前而言,部分正确的答案总比没有好。。一些简单的伪代码会让这个答案很棒,但无论如何+1。@hasen j:伙计-1真的吗?是的,200位怎么样,到底是怎么提供64位有害或不准确的信息的?