2013-12-18 25 views
5

在表達式p + a其中p是一個指針類型,而a是一個整數,整數提升規則是否適用?例如,如果achar,在64位機器上它肯定會擴展到64位,然後纔會被添加到指針值(在編譯的程序集中),但它是由標準指定的嗎?什麼將被提升到? intintptr_tptrdiff_tunsigned charsize_t將被轉換爲什麼?指針運算和積分提升

+2

該標準沒有指定。它只定義了操作的結果是什麼:[expr.add]段落5(從n3797開始)。 如果將具有整數類型的表達式添加到指針或從指針中減去,則結果的類型爲指針操作數的 。

+0

從[expr]第10段(從n3797開始) **目的是生成一個通用類型**,它也是結果的類型。這種模式稱爲通常的**算術轉換**正如我們所知,類型(指針)算術轉換不適用於這種情況。 –

+0

這麼多衝突的答案...... –

回答

1

它不要求任何推廣的標準似乎發生,因爲char是一個整數類型:

對於另外,無論是兩個操作數應有的算術或無作用域的枚舉類型, 或一個操作數應爲指向一個完全定義的對象類型,另一個應該有整數或無限枚舉類型

看來實現可能取決於底層架構允許的指針添加類型 - 所以如果架構支持address+BYTE - 一切都很好與char - 如果不是,它可能會提升到支持的最小地址偏移量大小。

指針的減法的結果被定義爲類型`的std :: ptrdiff_t的」的

當兩個指針相同的數組對象的元素相減,其結果是的下標之差兩個數組元素。結果的類型是實現定義的有符號整型;這種類型應該是在標題中定義爲std :: ptrdiff_t的相同類型

0

我想說正常整數升級應用於a。 C-Standard不提供任何特定的規則來轉換指針上的算術運算的整數部分。

也就是說,當a聲明char,它被轉換爲int被傳遞給操作者+之前。

如果再加一個size_t它要麼留什麼size_t被定義爲,或者如果(無論何種原因)它具有較小的排名則int它提升到int

0

是的,它在該

通常的算術轉換針對 算術或枚舉類型的操作數執行的C++標準(段落#1部5.7加法運算符)被指定。

對於rank小於int的類型(例如char或unsigned char),將執行整數提升。對於size_t(size_t的級別不小於int或unsigned int的級別),則不會執行任何操作,因爲沒有算術類型的第二個操作數。

1

C++ 11§5。7/1:

「加法運算符+-組左到右。通常的算術轉換是針對算術或枚舉類型的操作數執行的。 」

這顯然降低了問題要考慮通常的算術轉換,由下式定義…

C++ 11§5/ 9:

「意想不到算術或 枚舉類型原因的轉化率和產率結果類型的操作數以類似的方式 許多二進制運算符。目的是爲普通類型,這也是 類型的結果這種模式被稱爲通常的算術轉換, 其被定義爲如下:

  • 如果操作數是作用域枚舉的類型(7.2),不執行轉換;如果otheroperand不具有相同的類型,則該表達式是不合格的。

  • 如果任一操作數的類型爲long double,則另一個操作數應轉換爲long double

  • 否則,如果其中一個操作數是double,另一個應轉換爲double

  • 否則,如果任一操作數是float,則另一個應轉換爲float

  • 否則,積分促銷(4.5)應在兩個操作數上執行。然後以下規則應適用於提升的操作數:

    • 如果兩個操作數具有相同類型,則不需要進一步轉換。否則,如果兩個操作數具有帶符號整數類型或兩者都具有無符號整數類型,則具有較小整數轉換等級類型的操作數應轉換爲具有較大等級的操作數的類型。否則,如果具有無符號整數類型的操作數的秩大於或等於另一個操作數的類型的秩,則帶符號整數類型的操作數應轉換爲具有無符號整數的操作數的類型類型。否則,如果具有有符號整數類型的操作數的類型可以表示具有無符號整數類型的操作數類型的所有值,則具有無符號整數類型的操作數應轉換爲操作數的類型,其中有符號整數類型。

    • 否則,兩個操作數都應轉換爲與帶符號整數類型的操作數的類型相對應的無符號整數類型。」

其次機械,這組規則將在最後一個項目符號點結束(在標準短劃線)和指針操作數轉換成無符號整數型對應的東西的非現有。這是錯誤的。因此措辭「通常的算術轉換是對算術或枚舉類型的操作數執行」不能被字面解釋–它是恕我直言的缺陷–但必須解釋爲「通常的算術轉換是針對兩個操作數都是算術或枚舉類型「

因此,促銷因此,這是通過通常的算術轉換調用,不會發揮作用,當一個操作數是一個指針。

但是在§5.7中有一點發現......

C++ 11§5.7/ 5:

「當具有整體式的表達式被加到或減去一個指針,其結果具有指針操作數的類型。如果指針操作數指向數組對象的一個​​元素,並且該數組足夠大,則結果指向與原始元素偏移的元素,以使得結果數組元素和原始數組元素的下標之差等於整數表達式。 」

這個定義了完全根據數組索引的結果。對於char陣列,下標的差異可能會超出ptrdiff_t的範圍。實現來安排它的一個合理方法是將非指針參數轉換爲無符號整型size_t(在位級有效地標記擴展),並將該值與模運算結合使用來計算結果指針值。