2012-02-07 154 views
2

鍵入常數在C/C++,有說(1U)((unsigned int)1)之間的差?我更喜歡第二個,但是我擔心第二個可能在運行時被類型化(即額外的cpu週期),而第一個在編譯時獲得正確的類型。謝謝。限定C/C++

+3

即使它有什麼區別,它也會在編譯時被幾乎每一個現代編譯器。 – casablanca 2012-02-07 03:41:07

+0

我確定有一些技術上的差異,但沒有實際的差異。 – Xeo 2012-02-07 03:42:19

+1

我很好奇你認爲用什麼指令將int(1)轉換爲unsigned int(1)。 – 2012-02-07 04:04:48

回答

0

11個字符。否則,它們是等效的。

1

我想你是正確的。 (1U)我懷疑編譯器的詞法分析會將其識別爲「無符號」,而(無符號整數)1則是運行時操作。正如評論所說,無論如何,它很可能會被優化。

作爲一般規則,不要試圖走出覺得編譯器。做出看起來最具可讀性的內容,並在問題變得明確後再擔心性能優化。 我可以保證*這永遠不會導致你的問題。

*保證無效日期以Y結尾

+1

作爲運行時操作的'(unsigned int)1'幾乎是零,即使對非優化編譯器的優化程度最低。 – 2012-02-07 04:02:22

5

它們不等同。 1U#if預處理指令中有效。 (unsigned int)1是預處理器級別的語法錯誤。然而,你可以使它成爲(unsigned)+1,它在預處理器中是有效的,但僅僅是因爲幾乎沒有人知道這個晦澀的規則。

+0

'預處理器號碼'很奇怪! ISO/IEC 9899:1999,§6.4.8_預處理numbers_將語法定義爲(指示換行符的管道):'pp-number:digit | 。數字| pp-number數字| pp-number identifier-nondigit | pp-number e sign | pp-number E sign | pp-number p sign | pp-number P sign | pp-number。' 這意味着_pp-number_可以包含各種字母字符。 的'(無符號)'是(可能)沒有被定義爲一個數字,所以它被轉換爲0,和'(0)+ 1'是有效的作爲整數 - 雖然可能不是爲無符號值,儘管出現於相反。 – 2012-02-07 03:55:04

+0

關於它沒有被簽名的好處。無論如何,PP級別的簽名是如何工作的?所有的算術運算就像在一個最大值的整數類型中一樣,但是簽名/無符號比較問題,巨大值的溢出/包裝等等呢? – 2012-02-07 04:00:09

+0

綜觀§6.10.1_Conditional inclusion_,¶3:_After由於宏擴展和定義的一元運算符 所有替代已經被執行,所有剩餘的標識符替換爲PP-數 0,然後每個預處理標記轉換成一個令牌。將得到的令牌 構成控制常量表達式其根據的 6.6規則評價,不同之處在於所有符號整數類型和所有無符號整數類型充當如果它們具有 相同的表示爲分別的類型'intmax_t'和'uintmax_t'在頭文件''中定義了 '.__ – 2012-02-07 04:13:02