2014-03-12 68 views
2

我有一個程序使用多個不同的int類型。與不同int類型的操作

最常用的是uint64_t和標準int。但是我想知道我是否可以安全地在他們之間進行混合操作。

例如我有一個uint64_t,我想添加一個int它並將該值另存爲uint64_t

正在做這樣的事情安全嗎?在我可以使用它之前,是否必須將int轉換爲uint64_t

我不能在網上找到關於它的東西。它可能只是被允許的,沒有人會質疑它,或者我的Google查詢是錯誤的。

無論如何,基本上我的問題是我可以混合使用不同類型的整數進行操作嗎?

+0

在算術之前更好地轉換爲更高精度的類型。 – herohuyongtao

+2

演員是不必要的。 C規範說int會轉換爲最大類型。 – stark

+0

[Cert C標準](https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules)討論轉換規則和陷阱。 –

回答

4

是的,你可以。

您的編譯器將負責轉換。唯一擔心的是溢出 - 如果將結果存儲在比輸入小的容器中。

您所需要的谷歌搜索詞是「隱式類型轉換」 - 見例如http://pic.dhe.ibm.com/infocenter/ratdevz/v8r5/index.jsp?topic=%2Fcom.ibm.tpf.toolkit.compilers.doc%2Fref%2Flangref_os390%2Fcbclr21011.htm

這種聯繫包括下表:按以下順序

算術轉換收益:

Operand Type         Conversion 
---------------------------------------------+-------------------------------------------- 
One operand has long double type    | The other operand is converted to long double type. 
---------------------------------------------+-------------------------------------------- 
One operand has double type     | The other operand is converted to double. 
---------------------------------------------+-------------------------------------------- 
One operand has float type     | The other operand is converted to float. 
---------------------------------------------+-------------------------------------------- 
One operand has unsigned long long int type | The other operand is converted to unsigned long long int. 
---------------------------------------------+-------------------------------------------- 
One operand has long long int type   | The other operand is converted to long long int. 
---------------------------------------------+-------------------------------------------- 
One operand has unsigned long int type  | The other operand is converted to unsigned long int. 
---------------------------------------------+-------------------------------------------- 
One operand has unsigned int type   | 
and the other operand has long int type  | 
and the value of the unsigned int can be  | 
represented in a long int     | The operand with unsigned int type is converted to long int. 
---------------------------------------------+-------------------------------------------- 
One operand has unsigned int type   | 
and the other operand has long int type  | 
and the value of the unsigned int cannot be | 
represented in a long int     | Both operands are converted to unsigned long int 
---------------------------------------------+-------------------------------------------- 
One operand has long int type    | The other operand is converted to long int. 
---------------------------------------------+-------------------------------------------- 
One operand has unsigned int type   | The other operand is converted to unsigned int. 
---------------------------------------------+-------------------------------------------- 
Both operands have int type     | The result is type int. 
---------------------------------------------+-------------------------------------------- 
+0

感謝您的解釋!我認爲uint64_t是等於或高於無符號long long類型?取決於執行無符號long long? – RG337

+0

是的 - 像'uint64_t'這樣的定義是「已知大小」的定義,而'long'或'long long'在某種程度上依賴於實現。編譯器中的頭文件將處理這個問題 - 確保前一種類型在您的代碼從一個平臺移動到另一個平臺時使用「安全」。但爲了上述目的,類型被「翻譯」爲適當的本地類型,並且適用通常的規則。 – Floris

0

C standard says,

如果具有無符號整數類型的操作數具有大於或等於另一操作數類型的等級,則具有符號整數類型的操作數將轉換爲具有無符號整數類型的操作數的類型。

因此作爲int & unsigned int是同級別的,你可以添加它們,當你添加它們int轉換爲unsigned intunsigned int再次離開的結果。

+0

我看到和排名是基於大小('類型')? – RG337

+0

@prgmjunkie true –

相關問題