2010年9月6日 星期一

594 - One Little, Two Little, Three Little Endians

寫一個能完全相容於不同作業系統、不同系統版本與硬體平台的程式是一件困難的事,其中一個困難點在於不同的硬體製造商會選擇不同的方式來儲存記憶體中的整數資料,由於不同的平台有不同的表示方式,所以平台間的資料傳輸必須考慮到彼此間的差異並做出調整。

幸運的是,目前硬體製造商之間普遍存在一種共識,皆把記憶體以8個位元(8-bit)為一個位元組(byte)的方式定址,但是當整數資料長度超過8-bits時(例如2 bytes, 4 bytes, 8 bytes),就沒有固定的定址方式,這衍生出兩種不相容的儲存格式,第一種整數的儲存方式是把最低的字元組(least significant byte)定址在較底的記憶體位置,並把最高的字元組(most significant byte)定址在較高的記憶體位置,而另一種方式則剛好相反,最低的字元組(least significant byte)定址在較高的記憶體位置,並把最高的字元組(most significant byte)定址在較低的記憶體位置。這兩種方式分別被稱為小頭端與大頭端(Little Endian, Big Endian)。另外整數的儲存還有另一種普遍的做法是以「二進制補碼(two's complement)」表示,而本題就是用這種方式。

當整數資料分別在以不同編碼方式的機器(Little Endian and Big Endian)之間共享時,就必須把資料的各個位元組反轉,當所有位元組都被反轉之後,不同編碼方式的資料就能以正確的方式解讀。本題的目的是要寫一個程式從輸入中取得一連串的整數,並把所有整數以另一種編碼方式表示出來。

Input

輸入會有許多整數,每個整數一列,並以EOF表示檔案結束。所有整數皆能以32-bit的有號整數表示(32-bit signed integer),也就是說其值介於-2147483648 到 2147483647之間。

Output

請將輸出以每個整數一列的方式印出來,輸出的格式請參考Sample Output。

Sample Input

123456789
-123456789
1
16777216
20034556

Sample Output

123456789 converts to 365779719
-123456789 converts to -349002504
1 converts to 16777216
16777216 converts to 1
20034556 converts to -55365375

原文出處

沒有留言:

張貼留言