长整型(long)和长长整型(long long)的区别是什么?

57

long long和long有什么区别?它们在处理12位数(600851475143)时都无法正常工作,我是否忘记了什么?

#include <iostream>
using namespace std;

int main(){
  long long a = 600851475143;
}

14
long long a = 600851475143LL;修改为这样,它就能运行。 - ildjarn
@ildjarn 为什么我在声明变量时已经使用了 (long long),还需要使用 (LL) 后缀来指定格式呢? - Mahmoud Gabr
5个回答

94
按照标准规定,对于以下类型的数据,可以保证:
  • int 至少占用16位
  • long 至少占用32位
  • long long 至少占用64位
在主要的32位平台上:
  • int 占用32位
  • long 也占用32位
  • long long 占用64位
在主要的64位平台上:
  • int 占用32位
  • long 可以为32位或64位
  • long long 也占用64位
如果您需要针对特定应用程序使用特定的整数大小,而不是依赖编译器自动选择所需大小,可以使用以下类型,需要包含头文件 #include <stdint.h> (或 <cstdint>):
  • int8_tuint8_t
  • int16_tuint16_t
  • int32_tuint32_t
  • int64_tuint64_t
此外,您还可能对以下类型感兴趣,需要包含头文件 #include <stddef.h> (或 <cstddef>):
  • size_t
  • ptrdiff_t

2
“long是32位或64位”是什么意思?它的位数可以改变吗? - Hikari Iwasaki
9
取决于目标平台。例如,如果你在Windows上编译,它可能是32位,而在Linux x86-64上,它可能是64位。类型大小不会在运行时改变。 - Joey Adams
2
而且,g++甚至有一个__int128类型来扩展列表... - Alexis Wilke

11

long long在C++98/C++03中不存在,但是在C99和c++0x中存在。

long至少保证32位。

long long至少保证64位。


5
为了解释@ildjarn的评论:
他们都不能处理12位数字(600851475143),我是否忘记了什么?
编译器查看文字值600851475143时,不考虑您正在分配/初始化的变量。您将其写为int类型的文字,它不适合int。
使用600851475143LL以获得long long类型的文字。

0

你的C++编译器支持long long,这在C99标准中保证至少为64位(这是C标准,而不是C++标准)。请参见Visual C++头文件以获取系统上的范围。

建议

对于新程序,建议仅使用bool、char、int和double,直到需要使用其他类型的情况出现。

http://www.somacon.com/p111.php


0

这取决于你的编译器。long long 是 64 位,应该可以处理 12 位数字。看起来在你的情况下它只是将其视为 long,因此无法处理 12 位数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接