2011年3月29日 星期二

UVa 594 One Little, Two Little, Three Little Endians.

解題背景

這題是傳說中的Endian問題。我們都知道int占用4 bytes,但是很神奇的這 4 byte 在記憶體中的排列方式並不固定,分為兩派,一派是以 Intel 為首的 little-endian,另一派是網路傳輸使用的 big-endian。

我用例子來說明,有個變數: int x = 11112345; 如果我們從記憶體的角度來看這個變數x,也就是轉換為二進位bit來觀察,那麼會看見以下兩種狀況:

變數 x 的四個 byte 在 big-endian 的機器上做如此排列
00000000 10101001 10001111 10011001
但是在 little-endian 的機器上,卻以這樣的方式儲存
10011001 10001111 10101001 00000000

兩者byte擺放的順序恰好相反,若一個不小心,就會解讀為完全錯誤的數值,因此 Endian 一直是計算機系統必須處理的問題,這兒有個連結談到Endians的歷史由來。本題就是要做 endian 轉換。

解題策略

C語言可以把 int 當作 char array 來操作,髒,但有效。
int big, little;
char * plittle = (char*) &little;
char * pbig = (char*) &big;
pbig[0] = plittle[3];
pbig[1] = plittle[2];
pbig[2] = plittle[1];
pbig[3] = plittle[0];

閒聊

感謝蔡神的大一計概。