我迅速通過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條列舉了一整套此類轉換。標準轉換序列是以下列順序的標準轉換序列:
- 從以下集合中進行零或一次轉換:左值到右值轉換,數組到指針轉換以及函數至指針轉換。
- 從以下集合中進行零或一次轉換:積分升級,浮點升級,積分轉換,浮點轉換,浮點積分轉換,指針轉換,指向成員轉換的指針以及 布爾轉換。
- 零或一個合格轉換。
請注意保證順序是在設置整數升級/轉換之前發生的左右轉換(等),但這並不意味着整數提示必須在轉換之前發生 - 它們只在同一組中。或者我的解釋是否正確?
您不能在同一標準轉換序列(「零或一個「)。 'char'到'unsigned int'是一個完整的轉換。 –