我正在从Java过渡到c++,对长数据类型有一些问题。在Java中,要保存大于232的整数,只需编写长x;。然而,在c++中,long似乎既是一种数据类型,也是一个修饰符。
long似乎有几种用法:
long x;
long long x;
long int x;
long long int x;
此外,似乎还有这样的事情:
long double x;
等等。
所有这些不同的数据类型之间的区别是什么,它们都有相同的目的吗?
我正在从Java过渡到c++,对长数据类型有一些问题。在Java中,要保存大于232的整数,只需编写长x;。然而,在c++中,long似乎既是一种数据类型,也是一个修饰符。
long似乎有几种用法:
long x;
long long x;
long int x;
long long int x;
此外,似乎还有这样的事情:
long double x;
等等。
所有这些不同的数据类型之间的区别是什么,它们都有相同的目的吗?
当前回答
从历史上看,在早期的C语言时代,当处理器有8或16位的字长时,intx与今天的短(16位)相同。在某种意义上,int是一种比char (short,longorlong)更抽象的数据类型,因为你不能确定位宽。
当定义int n时,你可以用“给我这台机器上n的位宽和速度的最佳妥协”来翻译它。也许在未来你应该期望编译器翻译成64位。所以当你想要你的变量是32位而不是更多的时候,最好使用显式的longas数据类型。
[编辑:#include <stdint.h>似乎是使用int##_t类型确保位宽的正确方法,尽管它还不是标准的一部分。]
其他回答
在Java中,long总是64位,而在c++中,这取决于计算机体系结构和操作系统。例如,long在Linux上是64位,在Windows上是32位(这样做是为了保持向后兼容性,允许32位程序在64位Windows上编译而不做任何更改)。Long int是Long的同义词。
后来,long long被引入,意思是“长(64位)在Windows上是真的”。Long Long int是这个的同义词。
它被认为是很好的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>中。
从历史上看,在早期的C语言时代,当处理器有8或16位的字长时,intx与今天的短(16位)相同。在某种意义上,int是一种比char (short,longorlong)更抽象的数据类型,因为你不能确定位宽。
当定义int n时,你可以用“给我这台机器上n的位宽和速度的最佳妥协”来翻译它。也许在未来你应该期望编译器翻译成64位。所以当你想要你的变量是32位而不是更多的时候,最好使用显式的longas数据类型。
[编辑:#include <stdint.h>似乎是使用int##_t类型确保位宽的正确方法,尽管它还不是标准的一部分。]
Long等价于Long int,就像short等价于short int。long int是至少32位的有符号整型,而long long或long long int是至少64位的有符号整型。
这并不一定意味着long long比long宽。许多平台/ abi使用LP64模型——其中长(和指针)为64位宽。Win64使用LLP64,其中long仍然是32位,long long(和指针)是64位宽。
这里对64位数据模型进行了很好的总结。
长双精度线并不能保证它至少和双精度线一样宽。
Long和Long int至少是32位。
Long Long和Long Long int至少是64位。你必须使用c99或更好的编译器。
长双头有点奇怪。详情请查阅维基百科。
这看起来令人困惑,因为作为数据类型本身,您要花费很长时间。
Long只不过是Long int单独使用时的简写。
Long是修饰语,也可以和Long double连用。
Long == Long int。
它们都占用4个字节。