【问题标题】:how to represent number bigger than long in c [duplicate]如何在c中表示大于long的数字[重复]
【发布时间】:2013-09-07 15:51:38
【问题描述】:

我想要一个变量来表示 C 中的数字 600851475143,但这个值大于 long 的最大值,即 2147483647。我应该使用什么数据类型?

【问题讨论】:

  • unsigned long? long long? unsigned long long?使用 bigint 库?
  • ...字符串? double? long double?一切都取决于您的需求!
  • 搜索 C 数据类型及其大小。有些甚至编译器支持 128 位整数。
  • 如果您需要更好的建议,您应该告诉我们您打算如何处理该号码。对于您要解决的问题,您提供的信息太少。

标签: c


【解决方案1】:

使用整数类型long long.
它至少适用于 -9223372036854775807

#include <stdio.h>
int main(int argc, char *argv[]) {
  long long big = 600851475143;
  printf("%lld\n", big);  // prints 600851475143
  return 0;
}

或者,可以使用int64_tuint64_t - 64 位类型。


上述范围是C11 5.2.4.2.1中规定的最小范围。

【讨论】:

    【解决方案2】:

    使用无符号长整数。这将只允许数字 >= 0,但它会扩展您的范围。我会确保你的 long 类型是 64 位的,因为这也会扩展你的值范围。

    您也可以使用 gmplib,它是在 LGPL 下发布的:http://gmplib.org/

    【讨论】:

    • 可能是一个错字,但只是为了避免在帖子中留下不正确的信息:“这将只允许数字 >= 0
    • @SevenBits 为保证整数类型为 64 位,简单使用int64_tuint64_t
    • @LorenzoDonati 谢谢,是的,这是一个错字。我现在就更正一下。
    【解决方案3】:

    除了使用@H2CO3 建议的任意精度整数数学库之外,如果您打算使用如此大的数字而不担心溢出,这可能是您最好的选择,您应该检查您的编译器/平台文档以获得最大可表示号码。

    如果您不需要有符号算术,您可以使用unsigned longunsigned long long,否则使用signed long long。请记住,该标准并未严格规定它们的大小,仅指定了最小值(来自 C99 草案标准 - 附件 E):

    #define LONG_MAX +2147483647
    #define LONG_MIN -2147483647
    #define LLONG_MAX +9223372036854775807
    #define LLONG_MIN -9223372036854775807
    // [...]
    #define ULONG_MAX 4294967295
    #define ULLONG_MAX 18446744073709551615
    

    【讨论】:

    • 但是它自己的那些类型的大小是再次实现定义的,不是吗?或者为什么在所有平台上我知道 long 的大小在 32 位和 64 位拱形中不同?
    • @Zaibis Lorenzo Donati 发布了最低。这些值是实现定义的,但将至少覆盖上述范围,因此long 可以是 4 个或更多 8 位字节。
    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多