ChatGPT解决这个技术问题 Extra ChatGPT

C++ 中的“long”、“long long”、“long int”和“long long int”有什么区别?

我正在从 Java 过渡到 C++,并且对 long 数据类型有一些疑问。在 Java 中,要保存大于 232 的整数,只需编写 long x;。但是,在 C++ 中,long 似乎既是数据类型又是修饰符。

似乎有几种使用 long 的方法:

long x;
long long x;
long int x;
long long int x;

此外,似乎还有以下内容:

long double x;

等等。

所有这些不同的数据类型有什么区别,它们的目的是否相同?

@user2612743 - 为了安全起见,请考虑您的要求并使用适当的类型。 long long 可能比 long 慢,而 long 可能比 int 慢。
不,“为了安全,用long long”和说“为了安全,给每个人一个地球艾滋病,这样我们就不用担心安全性行为了,反正我们都已经得到了!”傻,不是吗?考虑数据及其可能具有的值,并使用最合适的类型。这也有助于编译器在不破坏原始代码意图的情况下进行额外的优化,例如如果它必须加载额外的库来处理大于目标平台自然位宽的数字。
将 long long 与 win32 列表框等一起使用不会对您的内存和其他变量造成严重破坏 - 即使没有违反限制。即使有看似无害的 C4244 警告,也不容易检测到。

p
paxdiablo

longlong int 是相同的。 long longlong long int 也是如此。在这两种情况下,int 都是可选的。

至于这两个集合之间的区别,C++ 标准规定了每个集合的最小范围,并且 long long 至少与 long 一样宽。

标准的控制部分(C++11,但这已经存在了很长时间)例如,3.9.1 Fundamental types,第 2 节(后面的部分给出了无符号整数类型的类似规则):

有五种标准有符号整数类型:signed char、short int、int、long int 和 long long int。在此列表中,每种类型提供的存储空间至少与列表中它前面的类型一样多。

7.1.6.2 Simple type specifiers 中还有一个表 9,它显示了说明符到实际类型的“映射”(表明 int 是可选的),其中一部分如下所示:

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

请注意说明符和类型之间的区别。说明符是您告诉编译器类型是什么的方式,但您可以使用不同的说明符以最终获得相同的类型。

因此,long 本身既不是您的问题所提出的类型 也不是 修饰符,它只是 long int 类型的说明符。 long long 也是 long long int 类型的说明符。

尽管 C++ 标准本身并没有指定整数类型的最小范围,但它确实在 1.2 Normative references 中引用了 C99 作为应用。因此,C99 5.2.4.2.1 Sizes of integer types <limits.h> 中列出的最小范围是适用的。

long double 而言,这实际上是一个浮点值而不是整数。与整数类型类似,它需要至少具有与 double 一样高的精度,并提供该类型的值的超集(意味着 至少 这些值,不一定更多 值)。


unsignedunsigned int 也一样
我很确定 long 至少为 32 位(零的任一侧为 2^31-1),而 long long 至少为 64(任一侧为 2^63-1)。
并且 long double 保证至少具有 double 的范围,但可能相同。这取决于计算机。一些 FPU 具有扩展精度; x87 芯片具有 32 位单精度、64 位双精度和 80 位扩展精度。
至于范围要求,C++11标准参考了C11标准,有实际范围。
@AbhishekMane:我相信 long int(b) 的问题可能只是因为 long 被认为是与其他演员 int(b) 分开的东西。如果您将 long(b)(long int)(b) 甚至 typedef long int LI;using LI = long int; 之一与 LI(b) 一起使用,它可以正常工作。不过,我发现很难引起很多兴趣,因为 C++ 开发人员可能应该尽可能避免使用旧样式转换。如果您要合并旧版 C 代码但 C 中没有 <someType>(var),请务必使用 (long int)b :-)
M
MBT

Long 和 long int 至少为 32 位。

long long 和 long long int 至少为 64 位。您必须使用 c99 或更好的编译器。

长双打有点奇怪。 Look them up on Wikipedia for details.


B
Brett Hale

long 等同于 long int,就像 short 等同于 short intlong int至少 32 位的有符号整数类型,而long longlong long int至少 64 位的有符号整数类型。

这并不一定意味着 long longlong 宽。许多平台/ABI 使用 LP64 模型 - 其中 long(和指针)为 64 位宽。 Win64 使用 LLP64,其中 long 仍然是 32 位,而 long long(和指针)是 64 位宽。

对 64 位数据模型有很好的总结here

long double 不能保证至少double 一样宽。


S
Siraj Alam

这看起来令人困惑,因为您将 long 作为数据类型本身。

当您单独使用它时,long 只不过是 long int 的简写。

long 是一个修饰符,您可以将它与 double 一起使用,也可以用作 long double

long == long int

它们都占用 4 个字节。


长占 4 字节仅在 Win64 上有效,它取决于平台
是的,显然...不仅 long...int 需要 4 个字节,而且 2 个字节取决于平台,毫无疑问。
x
xjcl

虽然在 Java 中 long 始终是 64 位,但在 C++ 中,这取决于计算机体系结构和操作系统。例如,long 在 Linux 上是 64 位,在 Windows 上是 32 位(这是 done to keep backwards-compatability,允许 32 位程序在 64 位 Windows 上编译而无需任何更改)。 long intlong 的同义词。

后来,long long 被引入表示“这次在 Windows 上真正的长(64 位)”。 long long int 是这个的同义词。

considered good C++ style 避免 shortintlong 等,而是使用:

std::int8_t   # exactly  8 bits
std::int16_t  # exactly 16 bits
std::int32_t  # exactly 32 bits
std::int64_t  # exactly 64 bits

std::size_t   # can hold all possible object sizes, used for indexing

您可以通过包含 <cstdint> 标头来使用这些 int*_t 类型。 size_t<stdlib.h> 中。


t
thomiel

从历史上看,在早期的 C 时代,当处理器具有 8 位或 16 位字长时,int与今天的short(16 位)相同。在某种意义上,int 是一种比charshortlonglong long 更抽象的数据类型,因为您无法确定位宽。

定义时int n;您可以将其翻译为“在这台机器上为 n 提供位宽和速度的最佳折衷方案”。也许在未来您应该期望编译器将int转换为 64 位。因此,当您希望变量具有 32 位而不是更多时,最好使用显式long作为数据类型。

[编辑:#include <stdint.h> 似乎是使用 int##_t 类型确保位宽的正确方法,尽管它还不是标准的一部分。]


最后一部分,在 int 为 64 位时使用“long”来获取 32 位,这是不正确的。如果 int 是 64 位,那么 long 也至少是 64 位。 Long 保证至少和 int 一样大,虽然它可能更大,但绝不会更小。大多数编译器都有各种方法可以让程序员更具体,例如(不可移植的)__int32 类型,它正好是 32 位,等等。
正如 C 标准中所定义的,long 保证为至少 32 位。 (标准可能会改变。)当前的 C++14 草案只是说:@CM“普通整数具有执行环境架构建议的自然大小,提供其他有符号整数类型以满足特殊需求”(第 3.9.1 节)。我没有找到关于其中各种整数的长度关系的消息。 __int32 并不是标准的真正一部分,但由于 C++11 有可用的类型定义,如 int_fast32_t 或 int_least32_t 可以让你得到你想要的。
我想说,在 20 世纪通用可重编程微型计算机的实现中,char 几乎一致为 8 位,short 为 16,long 为 32; int 可以是 16 或 32。请注意,对于某些平台(尤其是 68000),16 位和 32 位 int 都很常见,而且确实有些编译器可以选择支持其中任何一个。因此,需要可移植的代码应优先使用 shortlong 而不是 int
M
Mohanad Talat

没有定义, (long long x ) 等价于 (long long int x ),但第二个确认变量 x 是整数


这个答案对前面的答案有什么补充?
这个答案简短而直接,因为答案需要