2011-12-29 83 views
9

int默認signed long int在C++?在C++中,默認情況下是`int long`嗎?

它是依賴於平臺和/或編譯器嗎?如果是這樣,怎麼樣?

[編輯]

以下任何一項是否保證重複?

signed short int 
signed int 
signed long int 
signed long long int 
unsigned short int 
unsigned int 
unsigned long int 
unsigned long long int 
+0

'linux-amd64'' int'有32位,而'long'有64位。 – 2011-12-29 23:37:17

+0

這很明顯:爲什麼語言會燒掉一個關鍵字來表示相同的東西? – 2011-12-29 23:43:26

+3

不能同意這一點。它不總是理想上沒有歧義和冗餘。 – qazwsx 2011-12-29 23:47:51

回答

8

所有的整數類型是不同的,即你可以安全地重載所有這些函數,你不會有任何衝突。但是,有些時候使用相同數量的比特來表示。即使他們使用相同數量的位,有符號和無符號類型的總是有不同的範圍。除了char之外,使用任何不帶signed的整數類型等同於使用signed,即signed intint是等同的。 char是與signed charunsigned char不同的類型,但char具有與signed charunsigned char相同的表示形式和範圍。您可以使用std::numeric_limits<char>::is_signed找出它使用的是哪一個。

談到更有趣的方面。以下所有條件:

  • 7 <= std::numeric_limits<signed char>::digits
  • sizeof(char) == 1
  • sizeof(char) == sizeof(signed char)
  • sizeof(char) == sizeof(unsigned char)
  • 15 <= std::numeric_limits<short>::digits
  • sizeof(char) <= sizeof(short)
  • ​​
  • 31 <= std::numeric_limits<long>::digits
  • sizeof(int) <= sizeof(long)
  • 63 <= std::numeric_limits<long long>::digits
  • sizeof(long) <= sizeof(long long)
  • sizeof(X) == sizeof(signed X)
  • sizeof(signed X) == sizeof(unsigned X)

(其中 「X」 是一個charshortintlong,和long long)。

這意味着所有整數類型的大小可以是相同的,只要這種類型的保持至少64位(顯然的Cray X-MP是這樣一個獸)。在當代機器通常sizeof(int) == sizeof(long)但有機器,其中sizeof(int) == sizeof(short)long是32位還是64位取決於實際架構,目前這兩種類型都在使用。

+0

您的模板參數因爲看起來像HTML標籤而消失,使用逐字標記(反引號)來防止這種情況。另外,我很確定你保證的'std :: numeric_limits :: digits'的最小值太高了。 – 2011-12-30 00:31:18

+0

'std :: numeric_limits :: digits> = 16',爲true。但是你的答案已經簽署了類型,並且'digits'被指定爲**「對於整數類型,表示中的非符號位數。」** – 2011-12-30 01:57:13

23

平原int簽訂後,它是否是相同的大小long int是與平臺相關的。

什麼保證的是,

sizeof (int) <= sizeof (long) 

int是大到足以容納至少所有數值爲-32767至32767


標準說什麼:(部分[basic.fundamental]

有五種標準符號整數類型:signed charshort int,int,long intlong long int。在這個列表中,每種類型至少提供與列表中前面那些相同的存儲空間。也可能有實現定義的擴展有符號整數類型。標準和擴展的有符號整數類型統稱爲有符號整數類型。 Plain int s具有執行環境架構所建議的自然大小;提供其他有符號整數類型以滿足特殊需求。

+7

+1,對於其他讀者來說:第一句中有一個重要的細節:'int'和'signed long int' **從不**相同*類型*,但它們可以有相同的* size *。 – 2011-12-29 23:59:13

6

普通int相當於signed int。這很標準。任何過去的事情都不能保證; intlong是不同的類型,即使您的特定編譯器使它們具有相同的大小。您唯一的保證是long至少大到int

4

longshort修飾符不完全像signedunsigned。後兩者可以放在任何整數類型上,但是如果將它們關閉,那麼對於每個整數類型(char除外),signed默認。所以intsigned int是相同的類型。

對於longshort,如果將它們關閉,則不會選擇,但結果類型不同。 long int,short intint都是不同的類型,其中short int < = int < = long int

intlongshortsignedunsigned是可選的:signed intsigned是相同的類型。

1

signedint默認情況下與signed int相同。

兩者都不是signed short intsigned long int

2

在C++ int默認爲signed int,所以沒有問題。但是,在C++中,intlong int是不同的類型,所以從語言的角度來看這是不一樣的。 intlong int的實現是平臺/編譯器特定的 - 它們都是可能相同的整型。 C++標準強加的唯一限制是sizeof(long int) >= sizeof(int)