2016-12-07 25 views
4

我迅速通過C++ 03標準的掃描,但仍行爲不能告訴我們,如果這種行爲是保證:標準C++符號字符來正整數轉換

signed char cNegOne=-1; //char is 8bits 
unsigned int a=cNegOne; //int is 32 bits in my Windows system 
printf("0x%x\n",a); 

結果是:

0xffffffff 

VC++在32位Windows中提供0xffffffff。但我的假設是,轉換可能發生在兩種方式:

1)8位有符號字符-1首先直接轉換爲8位無符號值,這是二進制11111111或十進制255然後加寬到32位, bit無符號整數給出255(0xff)。

2)8位有符號字符-1有符號擴展爲32位有符號整數給出0xffffffff然後重新解釋爲32位無符號整數。

顯然第二種方法在這裏使用。但爲什麼會這樣呢?在這個標準中,我找不到任何關於此的討論。它是具體實現嗎?

編輯:從C++ 03章原文4

標準轉化是內置類型定義隱式轉換。第4條列舉了一整套此類轉換。標準轉換序列是以下列順序的標準轉換序列:

- 從以下集合中進行零或一次轉換:左值到右值轉換,數組到指針轉換以及函數至指針轉換。

- 從以下集合中進行零或一次轉換:積分升級,浮點升級,積分轉換,浮點轉換,浮點積分轉換,指針轉換,指向成員轉換的指​​針以及 布爾轉換。

- 零或一個合格轉換。

請注意保證順序是在設置整數升級/轉換之前發生的左右轉換(等),但這並不意味着整數提示必須在轉換之前發生 - 它們只在同一組中。或者我的解釋是否正確?

+0

您不能在同一標準轉換序列(「零或一個「)。 'char'到'unsigned int'是一個完整的轉換。 –

回答

4

在C和C++中執行整數運算時,第一步是整數提升。簽名的字符和短褲成爲簽名;無符號字符和短褲變成無符號整數。即使您將兩條短褲放在一起,情況也是如此:操作本身是以整數進行的,而不是短褲。

所以,當你考慮整數轉換時,考慮促進和簽名改變。在C++標準中,這兩個步驟被描述爲一個。也就是說,在技術上不會發生單獨的整體升級,但如果目標類型比源類型更寬,則更改簽名的效果與在簽名更改之前進行顯式升級時會發生的效果相同。基本規則是結果必須是輸入模2^n,其中n是輸出類型的位數。對於-1和32位輸出類型的輸入,這意味着輸出爲2^32 - 1.

+0

看我的編輯。該標準是否確保在轉換之前進行促銷活動? – JavaMan

+0

@JavaMan我覺得我很容易解釋它。我會編輯。 – Sneftel

相關問題