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

新手上路,请多包涵

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

似乎有几种使用方法 long

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

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

 long double x;

等等。

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

原文由 1110101001 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.3k
2 个回答

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 longlong long int 类型的说明符。

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


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

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 3.0 许可协议

虽然在 Java 中 long 始终是 64 位,但在 C++ 中,这 _取决于计算机体系结构和操作系统_。例如, long 在 Linux 上是 64 位,在 Windows 上是 32 位(这样 做是为了保持向后兼容性,允许 32 位程序在 64 位 Windows 上编译而无需任何更改)。 long intlong 的同义词。

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

避免 shortintlong 等被 认为是良好的 C++ 风格,而是使用:

 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> 中。

原文由 xjcl 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题