2012-04-18 66 views
2

因此,当我偶然发现一些“问题”(例如来自C++ Primer第6版)时,我正在使用新数据类型long long进行一些测试。我正在使用爬库来告诉我长长支持的最大数量,并且都出来了9223372036854775807.这怎么可能?为什么数据类型长期支持等于long long的最大数量?

#include <iostream> 
#include <climits> 

int main() 
{ 
    std::cout << "int size is " << sizeof(int) << " bytes." << std::endl; 
    std::cout << "short size is " << sizeof(short) << " bytes." << std::endl; 
    std::cout << "long size is " << sizeof(long) << " bytes." << std::endl; 
    std::cout << "long long size is " << sizeof(long long) << " bytes." << std::endl; 

    std::cout << "Maximum values: " << std::endl; 
    std::cout << "int: " << INT_MAX << std::endl; 
    std::cout << "short: " << SHRT_MAX << std::endl; 
    std::cout << "long: " << LONG_MAX << std::endl; 
    std::cout << "long long: " << LLONG_MAX << std::endl; 

    return 0; 
} 
+0

参见每种数据类型所要求的最小* *尺寸这样一个问题:http://stackoverflow.com/questions/589575/size-of-int-long-etc,注那它是所需的最小尺寸,即数据类型可以大于指定值。 – Naveen 2012-04-18 06:17:41

回答

1

C99标准规定了每种类型必须能够表示的值的范围(§5.2.4.2.1)。指定的值是最小值,所以没有阻止有更大的范围。我将这个值转换为在数字计算机上用这些范围表示数字所需的最少位数。

  • int应至少为16位(范围为-32,768至32,767)
  • long应该至少32位(范围为2,147,483,648到2,147,483,647)
  • longlong应至少为64个位(范围从-9,223,372,036,854,775,808 9,223,372,036,854,775,807)
+0

C标准只规定了最小值范围(不是位宽),但这也是一个C++标记的问题。 – 2012-04-18 06:26:01

+1

@MichaelFoukarakis的确如此。尽管如此,C++ 11标准指的是C标准。有没有办法使用数字计算机在小于64位的范围内表示-9223372036854775808到9223372036854775807之间的整数? – Antoine 2012-04-18 06:42:08

+0

啊,我不知道,也许它应该放在答案中。该范围至少可以表示64位,但也可以更多。 ;-) – 2012-04-18 06:45:49

5

这是可能的,因为该long具有标准的任务是至少一样大intlong long必须至少一样大在long至少 64位在C++ 11中)。所以没有矛盾。

关于C++ 11中的long long,请参阅this related question

既然你标记记住,对于一个给定类型的数字限制在limits头给出的问题C++,熊,什么是C99 标准(即什么是<climits>)是不是在一定标准C++,即它可能是实现定义的。 long long(或更明确地说,其值范围)中的位数是C中的标准示例,其仅在C++ 11中成为标准。

5

因为您正在64位机器上运行,其中编译器将64位整数作为“long”和“long long”来实现。

如果您要为32位机器编译此代码,您会看到不同之处。例如:

$ g++ -m32 size.cpp 
$ ./a.out 
int size is 4 bytes. 
short size is 2 bytes. 
long size is 4 bytes. 
long long size is 8 bytes. 
Maximum values: 
int: 2147483647 
short: 32767 
long: 2147483647 
long long: 9223372036854775807 
+0

在C++ 11之前,'long long'的范围并不是标准的,所以你在你的例子中打印的结果应该是“实现定义的”,很可能会有所不同。 – juanchopanza 2012-04-18 06:50:26

+0

当然。这仅仅是一个例子。你应该知道你的编译器是如何实现这些的。我记得使用short和int都是16位的编译器。 – 2012-04-18 06:59:41

+0

我完全同意!但是,如果你想编写可移植的代码,那么知道什么是标准的,什么不是标准是很好的。 – juanchopanza 2012-04-18 07:05:07

相关问题