【问题标题】:What's the 'long' data type used for?'long' 数据类型用于什么?
【发布时间】:2010-12-01 21:22:57
【问题描述】:

我用 C++ 编程已经有一段时间了,而且我对大部分内容都非常熟悉。不过,我从未理解过的一件事是“长”数据类型。

我用谷歌搜索了它,但我仍然不知道它是做什么用的。我发现页面说它与 int 大小相同且范围相同。那么使用它有什么意义呢?

我在这里发现了另一个关于此的堆栈溢出问题: Difference between long and int data types

似乎两者之间唯一的区别是有时不同系统上的大小不同。这是否意味着在 64 位机器上使用 long 的应用程序无法在 32 位机器上运行?如果是这样,那么根本不使用它们不是更好吗?

我还注意到一些叫做“long int”甚至“long long”的东西!是数据类型还是修饰符?

【问题讨论】:

  • 我喜欢 C++,但是伙计……'long long' 作为数据类型非常有趣。
  • 我通常用它来存储货币价值,例如做多我的钱; // 是的,我的钱 looonnnnggg
  • @Tabber33 long long 在下一个标准 afaik 中
  • @turd:正确——这就是为什么我的句子是用现在时而不是将来时写的。
  • 新关键字会是“very”吗?

标签: c++ types long-integer


【解决方案1】:

它依赖于编译器。我的standards-fu有点生疏,但我相信它的定义如下:

char <= short <= int <= long <= long long

地点:

char      >= 8 bits
short     >= 16 bits
int       >= 16 bits
long      >= 32 bits
long long >= 64 bits

这意味着拥有char = short = int = long = long long = 64bits 是完全有效的,事实上某些DSP 的编译器就是这样设计的。


这强调了实际阅读编译器文档的重要性。

【讨论】:

  • @Anon:你能引用标准中的哪个地方这么说吗?我在现实生活中见过 char 为 32 位和 64 位的编译器。或者也许这只是 C 而不是 C++。
  • @Anon:这是一个错误的更正。 char 的大小(以位为单位)由例如给出CHAR_BIT 来自 &lt;limits.h&gt;。它必须 >= 8。
  • 几乎,sizeof(char) == 1CHAR_BIT 可以是任意数字。唯一的要求是保存平台的整个基本字符集。
  • @pst:我相信longint 的修饰符,它暗示int,因此int 关键字是可选的。有些人更喜欢它来澄清我们处理的是整数,而不是浮点数。
  • @Let_Me_Be:这是一个错误的更正。 CHAR_BIT 必须 >= 8。为了能够表示所需的数字范围(来自 C 标准)。
【解决方案2】:

我注意到一些叫做“long int”甚至“long long”的东西!是数据类型还是修饰符?

long intlong 相同(正如short intshort 相同)。

long long 是由多个编译器引入并被 C++0x 采用的独特数据类型。

注意没有long long long这样的东西:

error: 'long long long' is too long for GCC

【讨论】:

    【解决方案3】:

    来自您链接的问题中的一个答案:

    long 必须至少与 int 大小相同,并且可能(但不一定)更长。

    我想不出更好的解释方式。

    【讨论】:

      【解决方案4】:

      long 保证(至少)32 位。 int 仅保证(至少)16 位。在 16 位和 8 位系统上long 以效率为代价提供范围。

      干杯&hth.,

      【讨论】:

      • 真的吗?这些保证在哪里?
      • @Tabber33:在 C 标准中,C++ 标准所指的。 Hth.,
      • C++标准指的是C标准?哪个C标准?这对我来说是个新闻……我读过 C++03 标准,但我从来没有提到过 C 标准(我没有)。
      • @Tabber33:当前的 C++ 标准是 C++98,具有技术勘误 1 的错误更正,称为 C++03。由于 1998 年早于 1999 年,您可以很容易地推断出当前的 C++ 标准并未引用 C99。因此它指的是?
      • @Tabber33: C++03 §3.9,脚注 37 说,“目的是 C++ 的内存模型与 ISO/IEC 9899 编程语言 C 的内存模型兼容。”这意味着所有关于 POD 类型的陈述都基于 C89。对于此定义,它还引用了第 3.9.1 节脚注 39 中的&lt;climits&gt;。我没有 C89 的副本,但 C99 §5.2.4.2.1 说long 必须能够保存至少一个 32 位整数。因此,long 保证为至少 32 位。 QED。
      【解决方案5】:

      这就是 C++03 标准所说的 (3.9.1/2):

      四种有符号整数类型: “signed char”、“short int”、“int”和 “长整数。”在此列表中,每种类型 至少提供尽可能多的存储空间 列表中前面的那些。

      所以:sizeof(char) &lt;= sizeof(short) &lt;= sizeof(int) &lt;= sizeof(long)

      这就是 C++0x (3.9.1/2) 和 C99 (6.2.5/4) 标准所说的:

      五个标准有符号整数 类型,指定为有符号字符, 短整数、整数、长整数和长整数 长整数。

      • longlong int 的同义词
      • long long 在 C++03 中不存在,但在 C++0x 中会存在。

      【讨论】:

        【解决方案6】:

        我google了一下,还是不知道 它的用途是什么。我发现页面 说它的大小相同并且具有相同的 范围为 int。那么会是什么 使用它有什么意义?

        I've wondered the same thing. 并得出结论long 现在没用了。

        在 64 位系统兴起之前,C 整数类型的事实上的标准是:

        • char = (u)int8_t(请注意,C 早于 Unicode。)
        • short = int16_t
        • int = intptr_t [直到 64 位],int_fast16_t
        • long = int32_t [直到 64 位],intmax_t [直到 1999 年]
        • long long = int64_tintmax_t

        然而,今天,long 没有一致的语义。

        【讨论】:

          【解决方案7】:

          如果你想要一个保证为 32 位或 64 位的整数,有这样的类型,例如int64_t。如果您真的想确保您的 int 具有这样的大小,请使用这些类型而不是 long、long long 等。您需要为这些类型包含 cstdint(C 中的 stdint.h)。

          【讨论】:

          • 不幸的是,使用int64_t 之类的类型不足以确保代码的可移植性。鉴于uint16_t ffff16=0xFFFF; int64_t whoknows=ffff16*ffff16; 需要在 int 为 16 位的机器上产生 1,而在 33 位或更大的机器上产生 4294836225。在 int 是中间大小的机器上,它通常会产生 -131071,但据我了解,32 位机器的编译器可以做任何他们想做的事情,因为乘法会溢出。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多