2013-11-03 51 views
1

我正在做家庭作業,以打印出intfloat的大和小端值。我很難轉換成小端。從大轉換到小端C++

這裏是我的代碼

void convertLitteE(string input) 
{ 
    int theInt; 
    stringstream stream(input); 
    while(stream >> theInt) 
    { 
     float f = (float)theInt; 

     printf("\n%d\n",theInt); 
     printf("int: 0x"); 
     printLittle((char *) &theInt, sizeof(theInt)); 

     printf("\nfloat: 0x"); 
     printLittle((char *) &f, sizeof(f)); 
     printf("\n\n"); 
    } 
} 

void printLittle(char *p, int nBytes) 
{ 
    for (int i = 0; i < nBytes; i++, p++) 
    { 
     printf("%02X", *p); 
    } 
} 

當輸入爲12我得到了我所期望的

output: 
int: 0x0C000000 
float: 0x00004041 

但是當輸入爲1234

output: 
int: 0xFFFFFFD20400000 
float: 0x0040FFFFFFF9A44 

但我希望

int : 0xD2040000 
float: 0x00409A44 

當我通過for循環時,我可以看到哪裏出現垃圾值,然後打印所有的F's,但我不知道爲什麼。我嘗試了這麼多種不同的方式,但我無法實現它。

任何幫助將不勝感激。

+0

我使用的字符串,因爲我們必須要能夠一次在多個號碼進入。所以我只是使用getline,然後從字符串中獲取數字值。 –

+0

這是什麼語言? C++?你需要用正在使用的語言來標記你的問題。 – jwodder

+0

@Jeff它看起來像'convertLitteE'應該從十進制字符串轉換爲小端的十六進制輸出。該部分沒有根本問題。 – aschepler

回答

2

顯然,在您的系統上,char是一個帶符號的8位類型。使用無符號的8位字節,1234的4字節小端表示將是0xd2, 0x04, 0x00, 0x00。但是當在大多數系統上解釋爲簽名爲char時,0xd2變爲-0x2e

然後調用printf促進了charint與價值-0x2e,然後printf(這是不是很類型安全)在unsigned int,你通過了int讀取。這是未定義的行爲,但在大多數系統上它將與static_cast相同,因此您在嘗試打印第一個字節時獲得值0xFFFFFFD2

如果你堅持在這些函數中使用unsigned char而不是char,你可以避免這個特殊問題。

(但正如@jogojapan指出,這整個的做法是不可移植的。)

+0

非常感謝您的幫助。 –