2010-07-13 44 views
4

我對「int」風味(無符號整數,長整型,長整型長整型)有以下懷疑。有關「int」風味操作的疑問

當我們做一些操作(*,/,+, - )int和它的味道之間(可以說長整型) 在32位系統和64位系統是隱式類型轉換髮生了「INT」

爲例如: -

int x; long long int y = 2000;

x = y; (較高的分配給較低的一個數據截斷可能會發生) 我期待編譯器給這個警告但我沒有得到任何這樣的警告。 這是由於隱式類型轉換髮生在「x」這裏。 我正在使用gcc和-Wall選項。行爲是否會改變爲32位和64位。

由於 Arpit

+0

下面有非常好的答案,也許你可以標記爲正確的? – alecco 2010-07-15 16:19:01

回答

7

-Wall不激活所有可能的警告。 -Wextra啓用其他警告。無論如何,你所做的是一個完美的「合法」操作,因爲編譯器在編譯時並不總是知道可能被「截斷」的數據的值,所以它沒有警告:程序員應該已經意識到事實上,一個「大」整數不可能適合一個「小」整數,所以它通常取決於程序員。如果你認爲你的程序是以不知曉的方式編寫的,請添加-Wconversion

+0

是的,除了其他事情之外,-WConversion會告訴你何時將更大類型隱式轉換爲更小類型。 gcc的Apple分支也有'-Whorten-64-to-32'。 – JeremyP 2010-07-13 12:23:39

+0

+1 for -Wconversion。 – Dummy00001 2010-07-13 12:23:57

2

如果擔心,可以包括<stdint.h>和利用類型具有限定的長度,如uint16_t爲一個16位無符號整數。

1

請參閱http://gcc.gnu.org/ml/gcc-help/2003-06/msg00086.html - 代碼是完全有效的C/C++。

您可能想要查看靜態分析工具(稀疏,llvm等)來檢查此類型的截斷。

+0

嗯,海灣合作委員會的人有時並不是真正有幫助的... /我想到海灣合作委員會和嚴格的別名規則。 /我不寒而慄。 – Dummy00001 2010-07-13 12:21:59

3

沒有顯式類型轉換運算符的鑄造在C中是完全合法的,但可能有未定義的行爲。在你的情況下,int x;是簽名的,所以如果你嘗試在int範圍外存儲一個值,你的程序就會有未定義的行爲。另一方面,如果x被聲明爲unsigned x;,則行爲是明確的;通過減模UINT_MAX+1進行施放。對於算術,當你在不同類型的整數之間進行算術運算時,在算術之前'較小'類型被提升爲'較大'類型。如果編譯器不影響結果,那麼編譯器可以自由優化此升級過程,這會導致在將乘以獲得完整的64位結果之前將32位整數轉換爲64位的習慣用法。促銷活動有點混亂,並且在簽名和無符號值混合使用時可能會產生意想不到的結果。如果你想知道,你應該查看它,因爲很難非正式解釋。

+0

不錯的答案,但我傾向於避免「隱式投射」。按定義進行投射是明確的。轉換是隱含的或顯式的。 – 2010-07-13 06:10:27

+1

新的措辭更好嗎? – 2010-07-13 06:28:40

+0

@R:我不太確定。這裏的問題(如你在答案中注意到的)是涉及的類型,投射和轉換根本不會出現在圖片中。無論是演員還是轉換,都會存在相同的未定義行爲。給定'長x = 200000; int i = x; int j =(int)x;','i'和'j'的賦值都有一個(潛在的)問題。 – 2010-07-16 00:43:29

2

您的代碼完全有效(正如其他人所說的)。如果您想在大多數情況下以便攜式方式進行編程,則不應使用裸露的C類型int,longunsigned int,但可以更好地說明您打算如何處理它。

對於數組索引,總是使用size_t。無論你是否在32位或64位系統上,這將是正確的類型。或者,如果您想在平臺上採用最大寬度的整數,那麼您恰好使用intmax_tuintmax_t