2012-04-18 64 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

相關問題