2013-08-02 21 views
1

所以這個問題出現了,雖然做了一些簡單的編碼,但請考慮以下幾點:C++ 11,整數類型由範圍決定?

for(unsigned int x=0x00000000; x<0xFFFFFFFF; x++) 
{ 
    // ... 
} 

上面的代碼,按預期工作假設「的sizeof(unsigned int類型)> = 4」,但我們知道,在某些平臺上,這可能是不正確的,因此我interrested的東西都這樣;

for(RangeBasedInt<0x00000000, 0xFFFFFFFF>::type x=0x00000000; x<0xFFFFFFFF; x++) 
{ 
    // ... 
} 

其中「RangeInt」是一個模板,與「類型」是最小整數型大到足以容納從MINIMUM(00000000)至最大值(0xFFFFFFFF的)值的範圍內;

template<int MINIMUM, int MAXIMUM> 
struct RangeBasedInt 
{ 
    // Type based upon MINIMUM and MAXIMUM 
    typedef /* MAGIC */ type; 
}; 

所以問題就在於它的簡單性;

  1. 這是在標準庫的某處實現的嗎?
  2. 如果不是,是否有實現這個庫,否則我將不得不建立自己的基於的std :: numeric_limits

回答

2

這是很容易實現這個自己。所以不難我會說這是在語言實現:

typedef decltype(0xFFFFFFFF) RangeBasedInt; 
for(RangeBasedInt x=0x00000000; x<0xFFFFFFFF; x++) 
{ 
    // ... 
} 

2.14.2 [lex.icon]指出,不可分割的字面的類型,可容納值最小的類型。因此,如果int可以在您的機器上保存0xFFFFFFFF,則RangeBasedInt可能是int。在我的機器上,它是unsigned int

對於這個特定的限制(0xFFFFFFFF),標準保證它可以用內置整型之一表示。 ULONG_MAX必須不小於4294967295(0xFFFFFFFF),並且ULLONG_MAX必須不小於18446744073709551615(0xFFFFFFFFFFFFFFFF)。

更新

我站在SKEEN上的技術性修正。 [lex.icon]中的表6實際上沒有說「最小類型」。它實際上是說,如果文字是一個八進制或十六進制常量,這將是在下面的列表中的第一種類型中,其值可表示爲:

int 
unsigned int 
long int 
unsigned long int 
long long int 
unsigned long long int 

表的推移它指定不同的列表取決於是否字面量是小數,或不是,是否爲後綴。當我說「最小」時,我肯定是在解釋一下。具體細節請參考實際標準,而不是由我或其他人回答。在我寫這篇文章時,最新的C++ 1y草案是N3691

+0

如果下限(或兩者都是)爲負值會怎麼樣?你會如何處理? – Skeen

+0

然後你的'RangeBasedInt'實現變得更加複雜。 :-)然而,它只是像你想要的那樣複雜。如果你有一個限制表達爲負數,你仍然可以'decltype'該文字(假設它是一個文字)並獲得一個有符號的整數類型來表示它。如果你想做一個真正的一般'RangeBasedInt ',你可以做到這一點。它不存在於標準庫中。 decltype會有很大的幫助。 –

+0

我不相信2.14.2,說出你在說什麼,如果我錯了,請給我一個參考資料。GCC和Clang似乎都會爲限制(0x0,0xFF)產生int,其中unsigned char將是最小的類型。 (可能是編譯器不完善) – Skeen