2011-07-18 119 views
1

在下面的程序:奇怪結果與類型鑄造

int main(){ 

    int i = 0x52554153; 
    const char *s = reinterpret_cast<const char*>(&i); 
    std::string *s1 = new std::string(s); 
    std::cout<<"word is "<<*s1<<std::endl; 
    return 0; 
} 

我將4字節INT爲4字節的「const字符」字符串。我用過的整數值只不過是字符串「RUAS」的ascii值的集合。我期待在「cout」聲明中獲得相同的結果。但它打印出「SAUR」,與我所提供的完全相反。 請解釋我的輸出。

+1

你的處理器的字節順序是Little Endian。更多信息:http://en.wikipedia.org/wiki/Endianness – Juho

回答

5

問題是排序 - 在您的機器上,存儲的數字與字節存儲的順序相反0x53415552

此外,您還將一個整型變量的地址傳遞給std::string構造函數 - 這是未定義的行爲,因爲該變量構成了非空終止的字節塊,並且std::string構造函數僅接受以空字符結尾的字符串。

7

它叫做little-endianness - 大多數處理器體系結構存儲整數值,其中最低有效字節在前。順便說一句,string構造函數必須接收一個以null結尾的字符數組(所以純粹運氣是你的int旁邊的字節碰巧包含零)。