【问题标题】:Define the 64 bit width integer in Linux在 Linux 中定义 64 位宽的整数
【发布时间】:2011-12-21 03:20:18
【问题描述】:

我尝试在 Ubnutu 9.10 上使用 C 语言定义一个 64 位宽度的整数。 9223372036854775808 是 2^23

long long max=9223372036854775808
long max=9223372036854775808

当我编译它时,编译器给出了警告信息:

binary.c:79:19: warning: integer constant is so large that it is unsigned
binary.c: In function ‘bitReversal’:
binary.c:79: warning: this decimal constant is unsigned only in ISO C90
binary.c:79: warning: integer constant is too large for ‘long’ type

long类型是64位宽吗?

最好的问候,

【问题讨论】:

  • 你是在 64 位模式下编译吗?
  • 9223372036854775808 == 2**63,但最大的 64 位有符号整数比它小一。

标签: c


【解决方案1】:
   long long max=9223372036854775808LL; // Note the LL
// long max=9223372036854775808L; // Note the L

long long 类型至少为 64 位,long 类型至少为 32 位。实际宽度取决于编译器和目标平台。

使用int64_tint32_t 确保64 位/32 位整数可以放入变量中。

【讨论】:

  • 如果我使用int64_t,我需要包含什么头文件,或者我只包含stdlib.h?
  • 你可以在 'sys/types.h' 或 'stdint.h' 中找到 int64_t
  • 我还有一个问题,如果我想打印一个int64_t变量,我应该像%d这样传递什么参数
  • 不,不是%lld,如果你使用int64_t,%lld 是long long。您应该使用stdint.h 的定义常量,在本例中为PRi64printf("my var i64 is %" PRi64 "\n", i64);
  • 不正确。对于 int 而言太大的整数常量将自动提升为 long,如果它对于 long 而言太大,则将其提升为 long long。 L 和 LL 仅用于将较小的值强制为较大的类型,例如 9600 * 32 将溢出 16 位 int,因此您需要 9600L * 32 代替。
【解决方案2】:

您遇到的问题是您使用的数字 (9223372036854775808) 是 2**63,而您的 long long 可以容纳的最大值(作为 64 位有符号 2s 补码类型)比该数字小一- 2**63 - 1,或 9223372036854775807(连续 63 个二进制 1)。

对于long long(在本例中)来说太大的常量被赋予类型unsigned long long,这就是您收到警告integer constant is so large that it is unsigned 的原因。

long 类型至少为 32 位,long long 类型至少为 64 位(均包括符号位)。

【讨论】:

  • 是的,或者使用十六进制 - 有符号 64 位整数的最大值是 7FFF FFFF FFFF FFFF,OP 的值是 CCCC CCCC CCCC CCCC。正如你所说,它太大了(编译器甚至告诉 OP)
  • OP的值其实是0x8000 0000 0000 0000,但是是的。
  • 啊——抱歉,是的。我讨厌剪切和粘贴:(
【解决方案3】:

我认为这取决于您使用的平台。如果您需要确切地知道您使用哪种整数类型,您应该使用来自Stdint.h 的类型(如果您的系统上有此包含文件)。

【讨论】:

    【解决方案4】:

    我不确定它是否能解决您的问题(LL 解决方案看起来不错)。但这里有一个建议:

    您应该使用十六进制表示法来写某物的最大值。

    unsigned char max = 0xFF;
    unsigned short max = 0xFFFF;
    uint32_t max = 0xFFFFFFFF;
    uint64_t max = 0xFFFFFFFFFFFFFFFF;
    

    如您所见,它是可读的。

    显示值:

    printf("%lld\n", value_of_64b_int);

    【讨论】:

    • 我还有一个问题,如果我想打印一个int64_t变量,我应该像%d这样传递什么参数
    • %lld 或 inttypes.h 中定义的一些宏
    • @ronnybrendel 如果它是一个 unsigned long long int ;)
    • @NicolasGUILLAUME:我认为你在charshort 前面缺少unsigned,在int32_tint64_t 中缺少领先的u。在大多数平台上,您对max 的定义将具有-1 的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多