【问题标题】:Long Vs. Int C/C++ - What's The Point?长与。诠释 C/C++ - 有什么意义?
【发布时间】:2011-11-19 09:23:28
【问题描述】:

我最近了解到,C/C++ 中的longint 的长度相同。简单地说,为什么?甚至在语言中包含数据类型似乎几乎毫无意义。它有没有 int 没有的特定用途?我知道我们可以像这样声明一个 64 位的 int

long long x = 0;

但是为什么语言选择这样做,而不是仅仅使long 好...比int 更长?其他语言(例如 C#)可以做到这一点,那么为什么不使用 C/C++?

【问题讨论】:

  • 我们使用u8、s16、s32、u64等类型的原因
  • “C/C++ 中的 long 与 int 的长度相同。”不总是。 C++ 标准规定int 是处理器的“自然”大小,它可能并不总是像long 一样大。该标准还保证long 至少与int 一样长,因此并不总是保证它们大小相等。
  • 历史和建筑包袱。相信我,像你这样假设 intlong 总是相同的大小可能会受到伤害;当我们过渡到 64 位架构时,我目前正在修复我们的一个 C++ 静态库中的大量可移植性问题
  • 实际上,sizeof(long) == sizeof(int) 仅在 32 位架构或 64 位 Windows 上使用,这对于习惯了 sizeof(long) == sizeof(void *) 的程序员来说是一个冲击。
  • 我仍然觉得所有这些“长”和“短”的废话大多毫无意义。在这个架构上可能有这么长,在那个架构上可能有那么长,在另一个架构上可能还有另一个长度。完全不便携。 IMO 应该只有一个整数类型(当然有有符号和无符号的变体),如果你需要任何特定大小的东西,那么应该有类型(因为有)具有固定的、有保证的大小(即 uint8、 uint16 等)。

标签: c++ c integer long-integer


【解决方案1】:

使用 C 或 C++ 编写时,每种数据类型都是特定于体系结构和编译器的。在一个系统上,int 是 32,但您可以找到它是 16 或 64 的系统;它没有定义,所以由编译器决定。

至于longint,它来自于标准整数是16 位的时代,而long 是32 位整数——它确实int 长。

【讨论】:

  • @MGZero:您说得对,但您没有完全阅读答案。很久以前,intshort 在许多平台上的大小相同。如果int 仍然是 16 位,那么这将是一个“遗留”的东西。 int 基本上是为了在你碰巧在的任何平台上代表一个非常有效的整数大小。
  • +1 - 也很高兴提到这就是为什么 c99 定义了 uintNN_t 等类型来清除问题。
  • @MGZero,一点也不,这继续因平台而异,还有许多平台仍然定义intlong大小不一。
  • @Griwes,你暗示这是过去的事情,而事实上,现在有很多平台longint的大小不同,而且未来没有迹象表明没有这样的平台。您根本没有描述管理 C 中类型大小的实际规则。
  • @Mike:当我读到它时,他解释了当前情况的基本原理,一个必须在过去找到的基本原理。
【解决方案2】:

long 与 int 的长度不同。根据规范,long 至少与 int 一样大。例如,在带有 GCC 的 Linux x86_64 上,sizeof(long) = 8 和 sizeof(int) = 4。

【讨论】:

    【解决方案3】:

    longint 的大小不同,它至少int 的大小相同。引用 C++03 标准(3.9.1-2):

    有四种有符号整数类型:“signed char”、“short int”、 “int”和“long int”。在此列表中,每种类型至少提供 与列表中前面的存储空间一样多。普通整数有 执行架构建议的自然大小 环境);提供其他有符号整数类型以满足特殊需要。

    我对此的解释是“只需使用int,但如果由于某种原因不符合您的需求,并且您很幸运找到了另一种更适合的整数类型,请成为我们的客人并改用那个”。 long 可能更好的一种方法是,如果您使用的是...更长的架构。

    【讨论】:

    • "long 可能更好的一种方法是,如果您在一个架构上,它...更长。"并不真地。如果您编写可移植代码并且需要至少 32 位的整数,long 可能会更好。 long 按 C 标准保证不小于 32 位。 int 不保证(可能是 16 位)。
    • @SergeDundich:非常正确。没有借口不为我解决 C 中的问题。
    【解决方案4】:

    具体保证如下:

    • char 至少为 8 位(定义为 1 字节,不管它是多少位)
    • short 至少为 16 位
    • int 至少为 16 位
    • long 至少为 32 位
    • long long(在支持它的语言版本中)至少为 64 位
    • 上述列表中的每种类型至少与前一种类型一样宽(但很可能相同)。

    因此,如果您需要至少 32 位的类型,则使用 long 是有意义的,如果您需要相当快且至少 16 位的类型,则使用 int

    实际上,至少在 C 中,这些下限是用 范围 表示的,而不是大小。例如,该语言需要INT_MIN <= -32767INT_MAX >= +32767。 16 位要求由此而来,也源于整数以二进制表示的要求。

    C99新增<stdint.h><inttypes.h>,分别定义uint32_tint_least32_tint_fast16_t等类型;这些是 typedef,通常定义为预定义类型的别名。

    (大小和范围之间没有必然直接关系。实现可以使int 32 位,但范围只有-2**23 .. +2^23-1,其他8 位(称为填充位)对值没有贡献。理论上可能(但实际上极不可能)int 可能大于long,只要long 至少具有与int 一样宽范围。在实践中,很少有现代系统使用填充位,甚至除了 2 的补码之外的表示,但标准仍然允许这样的奇怪。你更有可能遇到嵌入式系统中的奇异特性。)

    【讨论】:

    • 那么就有问题了。因为几乎每个人都认为 int 将存储 32 位数字。所以他们通常将百万放入 int 变量中。现在每个人都认为我认为它是 32 位。如果我们要在政治上正确,每个人都应该开始使用 long 作为他们的默认数据类型。
    • @off99555 没有“默认数据类型”。你可以放心地假设 int 至少是 32 位,如果你的实现可以保证;所有符合 POSIX 的系统都这样做。如果您做出这样的假设,您的代码将无法移植到具有 16 位 int 的系统中。这可能是也可能不是一个好的权衡。 (而且“政治正确”是无关紧要的。)
    【解决方案5】:

    寻找完全不相关的东西,偶然发现了这个,需要回答。是的,这是旧的,所以对于以后上网的人来说......

    坦率地说,我认为这里的所有答案都不完整。

    long 的大小是您的处理器一次可以操作的位数的大小。它也被称为“词”。 “半字”是一个简短的词。 “双字”是 long long,是 long 的两倍(最初是由供应商实现的,不是标准的),甚至比 long long 更大的是“quadword”,它是 long long 大小的两倍但它没有正式的名称(也不是真正的标准)。

    现在,int 是从哪里来的?部分在您的处理器上注册,部分在您的操作系统上。您的寄存器定义了 CPU 处理的本机大小,这反过来又定义了诸如短和长之类的东西的大小。处理器的数据大小也被设计为最有效的操作大小。那应该是一个int。

    在今天的 64 位机器上,您会假设,因为 long 是一个字,而 64 位机器上的一个字是 64 位,那么无论处理器设计用于处理什么,long 将是 64 位,而 int 可能不是.为什么?您的操作系统已经选择了一个数据模型并为您定义了这些数据大小(几乎取决于它的构建方式)。最终,如果您使用的是 Windows(并使用 Win64),那么 long 和 int 都是 32 位。 Solaris 和 Linux 使用不同的定义(long 是 64 位)。这些定义称为 ILP64、LP64 和 LLP64。 Windows 使用 LLP64,Solaris 和 Linux 使用 LP64:

    型号 ILP64 LP64 LLP64 整数 64 32 32 长 64 64 32 指针 64 64 64 长长 64 64 64

    其中,例如,ILP 表示 int-long-pointer,LLP 表示 long-long-pointer

    为了解决这个问题,大多数编译器似乎支持直接使用 int32 或 int64 等类型设置整数的大小。

    【讨论】:

    • "long 的大小是您的处理器一次可以操作的位数的大小。" -- 标准没有说或暗示,而且它并不总是正确的。在需要多条指令才能对 32 位数量进行操作的 16 位字系统上,long 仍需要至少为 32 位。没有要求shortlong 宽度的一半,或者long longlong 宽度的两倍——在我使用的系统上也不是这样(16 位short , 64 位 long, 64 位 long long)。
    • 最后,all 符合 C 和 C++ 的编译器在 <stdint.h> 中定义了 int32_tint64_t(1999 年在 C 中引入,后来被 C++ 采用)。这是假设实现具有支持需求的类型;并非所有人都这样做。
    • 您的回复让我觉得您没有阅读完整的答案。
    • 由于你没有在评论中标记我,所以我直到现在才看到它。事实上,我确实阅读了整个答案。我的 cmets 怎么样让你认为我没有?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2011-01-07
    • 2010-11-15
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多