2015-12-01 129 views
15

這個問題來自我最近遇到的一個錯誤。我試圖將一些整數值保存爲十六進制文件。作爲一個例子,這是我應該做的:cout << std :: ios :: hex做什麼?

cout << std::hex << value << endl;     // (1) 

但錯誤,我用它爲以下幾點:

cout << std::ios::hex << value << endl;   // (2) 

編譯器不抱怨,但顯然結果是不正確的。我隨機嘗試了更多的值,並且似乎(2)實際上給出了部分正確的結果,只是它將作爲前綴。我不明白哪裏來的是哪裏,我在任何地方都看不到很好的參考。任何人都可以解釋底下發生了什麼?

cout << std::hex << 255 << endl;  // output: FF 
cout << std::ios::hex << 255 << endl; // output: 800ff 

cout << std::hex << 135 << endl;  // output: 87 
cout << std::ios::hex << 135 << endl; // output: 80087 

cout << std::hex << 11 << endl;  // output: b 
cout << std::ios::hex << 11 << endl; // output: 800b 

回答

17

這實際上是std::ios_base::hex。這是一個實現定義的位掩碼。在內部,該流具有一個稱爲fmtflags的整數,它存儲格式的當前狀態。

在您的實施中,hex是標誌0x800。其他的標誌將表明無論是在科學記數法模式,boolalpha是否對,等等,等等

std::hex功能設置std::ios_base::hex標誌fmtflags

所以你的輸出是這個標誌的整數值(以十六進制表示,因爲你以前發送過std::hex)。

6

std::hex是一個特殊的對象,當應用於使用operator<<流,

將流str的則baseField爲十六進制,彷彿調用str.setf(std::ios_base::hex, std::ios_base::base field)

std::ios::hex(又名std::ios_base::hex)是傳遞給setf方法的實際位掩碼值。它的值是實現定義的,在你的情況下似乎是0x800

10

std::hex操縱,即它是具有特定簽名的函數:

std::ios_base& hex(std::ios_base& stream) { 
    stream.setf(std::ios_base::hex, std::ios_base::basefield); 
    return stream; 
} 

存在用於流處理操縱定義一些特殊的輸出操作符。對於版本上引用運行到std::ios_base有(忽略的是,運營商實際上是一個函數模板):

std::ostream& operator<< (std::ostream& out, std::ios_base&(*manip)(std::ios_base&)); 

當流使用時,機械手功能被調用,它設置一個特定的格式標誌,在這種情況下std::ios_base::hex(這是如何std::ios::hex實際上定義)。由於std::ios_base::hex是一組標誌(其他標誌爲std::ios_base::decstd::ios_base::oct)的成員,因此它也需要清除組中的任何其他標誌。因此,用掩碼(std::ios_base::basefield)調用setf()來清除任何其他可能設置的標誌。

格式標誌std::ios_base::fmtflags是一個位掩碼類型。值std::ios_base::hex是其中的一個值。格式化時,你會得到一些數字,很可能是2的冪(然而,它不一定是2的冪)。您看到的值只是使用十六進制符號打印的0x800(即2048):設置任何格式化標誌(width()除外)爲粘性,即它們保持到標誌未設置爲止。如果你想看到的值2048(對於您所使用的執行),你會使用

std::cout << std::dec << std::ios_base::hex << "\n";  // 2048 
std::cout << std::hex << std::ios_base::hex << "\n";  // 800 
std::cout << std::showbase << std::ios_base::hex << "\n"; // 0x800 

最後一行設置指出的整數值的前綴底部的標誌showbase

  • 沒有前綴=>小數
  • 領先0x =>十六進制
  • 領先0(但沒有x)=>八進制
相關問題