2013-04-18 39 views
1

我猜C語言只是一個重新解釋類型,位模式保持不變。哪個C++類型是C類型的,相當於

我想了解當我將更寬的帶符號值轉換爲更窄的有符號值時會發生什麼。是否保留符號,還是簡單地將寬度較小的值解釋爲有符號值。

感謝您的任何幫助。

編輯 - 這是用於C99編譯的c代碼。問題不在於C++編譯器用粗糙的舊式轉換來做什麼,而在於如何定義C的功能。

+1

我想你誤解了'static_cast'的作用。你所描述的更像是'reinterpret_cast'。 –

+0

你是對的,我的壞,我正在糾正它。 – Pablitorun

+0

我在C99中找到了這個 「否則,新類型將被簽名,並且值不能在其中表示; 結果是實現定義的或實現定義的信號被引發。 聽起來像我永遠不知道會發生什麼。 – Pablitorun

回答

4

你不如果你只關心C,真的需要問一些關於C++的問題,但在你的例子中,C++和C仍然是大部分相同的東西;

C++表示,這些積分轉換:

如果目標類型有符號,則該值是不變的,如果它可以在目標類型來表示(和位域的寬度);否則,該值是實現定義的。

C99說,這些積分轉換:

否則,新的類型是有符號和價值不能在它來表示; 結果是實現定義的或者實現定義的信號被引發。

將較大的整數值轉換爲較小的帶符號整數值將盡可能產生相同的值,否則將給出實現定義的(即非便攜式)行爲。


§5.4/4個狀態

通過

  • const_cast類型轉換(5.2.11)進行轉換,
  • 一個的static_cast(5.2.9),
  • 一個static_cast後跟一個const_cast,
  • a reinterpret_cast(5.2。10),或
  • 一個的reinterpret_cast後跟一個的const_cast,

可使用明確的類型轉換的轉換符號來執行。

[...]

如果轉換可以在多於一個的上面列出的方式,即首先 出現在列表中解釋用於進行解釋,即使鑄造得到的從這個解釋是不合格的。

C++被定義爲它與C兼容;也就是說,C轉換將在C++中完成與C中相同的操作。這意味着C中的轉換符號實際上根據兩者之間的類型進行不同的操作。

+0

等待我很困惑,我正在使用C99編譯器。我認爲,如果我使用C風格轉換,你所回答的是C++編譯器會發生什麼。 – Pablitorun

+0

@ bames53,你能否詳細說明,我不確定這是如何回答這個問題的。 – Ben

+0

@Pablitorun是的,這個答案說明了當你使用C風格轉換時在C++中發生了什麼,但是C++被設計爲兼容行爲,所以如果你知道這些C++轉換做什麼,那麼你可以應用這些知識來知道C做了什麼。 – bames53

3

沒有相應的演員。

C cast可以表現爲所有C++類型轉換(dynamic_cast除外)。

2

C演員陣容最終將導致C++演員陣容(dynamic_cast除外)。這是中-ST是成功的第一投:

  • 的const_cast
  • 的static_cast
  • 的static_cast,然後const_cast會
  • 的reinterpret_cast
  • 的reinterpret_cast,然後const_cast會
+0

等待我很困惑,我正在使用C99編譯器。我*認爲*如果我使用C風格轉換,您回答的是C++編譯器會發生什麼。 – Pablitorun