2011-09-06 81 views
0
// Declaration of data type where 4 bytes are packed into an unsigned. 
int xbyte(packed_t word, int bytenum); 

int main() 
{ 
    int bytenum = 0; 
    typedef unsigned packed_t; 
    packed_t word; 
} 

// Extract byte from word, return as signed integer. 
int xbyte(packed_t word, int bytenum) 
{ 
    // Failed attempt at xbyte 
    return (word >> (bytenum << 3)) & 0xff; 
} 

我不確定如何在這個問題中聲明packed_t。我應該使用頂部的原型。這個詞甚至可以發揮作用。我迷路了,這是家庭作業的一部分。4個有符號的字節打包成一個32位無符號的

+0

請將此標記爲家庭作業 –

+0

'typedef unsigned packed_t;'有什麼問題? – Dani

+0

我無法弄清楚它有什麼問題,它似乎很好。我將它初始化爲什麼? – KDW

回答

2

您已有typedef一行。把它作爲這段代碼的第一行,你就完成了。基本的事情是,在你使用它的任何地方都必須顯示ed名稱。

+0

把它放在主體的頂部或主要的 – KDW

+0

正如我所說的,把*放在這個代碼片段的最頂端*。 –

0

也許是聯盟會在這裏

union packed_t 
{ 
    unsigned int unsignedInt; 
    char signedChar[4]; 
} 
1

首先,當然,你可以的typedef packed_t有用的任何整型你 想;但是,typedef必須在任何地方都可見packed_t, 。

其次,word >> (bytenum << 3)有點混淆。你 想要的是word >> (bytenum * 8),甚至更好:

return (word >> (bytenum * CHAR_BIT)) & ((1 << CHAR_BIT) - 1); 

(這很難說,最好的解決辦法是什麼在這裏:上述表達式 使便攜性甚至機器在那裏字節不是8位,但 子表達式&的權利是相當隱晦的,當然 值得評論。)

最後:我們應該讀任何東西到標題。如果你試圖 返回字節的值,就好像它是一個有符號的字節,那麼你需要 需要額外的代碼來處理。對於經典的32位二進制 補機,下面的工作:

int tmp = word >> (bytenum * 8); 
if ((tmp & 0x80) != 0) 
    tmp |= 0xFFFFFF80; 
else 
    tmp &= 0x7F; 
return tmp; 

更便攜(不,移植到機器不屬於2的 補8個字節是非常重要的),你必須寫:

int tmp = (word >> (bytenum * CHAR_BIT)) & ((1 << CHAR_BIT) - 1); 
if (tmp > SCHAR_MAX) 
    tmp -= UCHAR_MAX + 1; 
return tmp; 

但這也取決於實際需要什麼。第n個字節的值取決於硬件中整數的實際表示。上面的代碼忽略了這一點,並將低位字節作爲字節0返回,而不是 必然是第一個字節。如果你真的想要的第n個字節所需的類型雙關的某種 :

return *(reinterpret_cast<signed char*>(&word) + bytenum); 

沒有爲需要什麼樣的信息,這是很難說 正確的答案應該是什麼。

相關問題