轉貼地址:http://www.chinaunix.net/jh/23/823662.htmlphp
#######################
html
//聲明: 1 本帖做者是:converse ,至此感謝!編程
2 紅色背景字體爲本人添加內容!
網絡
3 黃色背景爲我的閱讀重點!
字體
#######################
ui
little endian和big endian是表示計算機字節順序的兩種格式,所謂的字節順序指的是長度跨越多個字節的數據的存放形式.
spa
簡單的說,little endian把低字節存放在內存的低位;而big endian將低字節存放在內存的高位.
.net
低 0x0000000 cd 12 12 高位
unix
| 0x0000001 ab 34 34 |
code
∨ 0x0000002 34 ab ab ∨
如今主流的CPU,intel系列的是採用的little endian的格式存放數據,而motorola系列的CPU採用的是big endian.
/******************************************************************** created: 2006-9-5 filename: test.cpp author: 李創 purpose: 可移植的用於判斷存儲格式是 little endian仍是big ednian的C代碼 取自<<C: A Reference Manual>> *********************************************************************/ #include <stdio.h> union { long Long; char Char[sizeof(long)]; }u; int main() { u.Long = 1; if (u.Char[0] == 1) { printf("Little Endian!\n"); } else if (u.Char[sizeof(long) - 1] == 1) { printf("Big Endian!\n"); } else { printf("Unknown Addressing!\n"); } printf("Now, Let's look at every byte in the memory!\n"); for (int i = 0; i < sizeof(long); ++i) { printf("[%x] = %x\n", &u.Char, u.Char); } return 0; }
/******************************************************************** created: 2006-9-5 filename: get32put32.cpp author: 李創 purpose: 在little endian和big ednian之間相互轉化數據的演示代碼 *********************************************************************/ #include <stdio.h> const unsigned char SIZE_OF_UNSIGNEDINT = sizeof(unsigned int); const unsigned char SIZE_OF_UNSIGNEDCHAR = sizeof(unsigned char); void put_32(unsigned char *cmd, unsigned int data) { int i; for (i = SIZE_OF_UNSIGNEDINT - 1; i >= 0; --i) { cmd = data % 256; // 或者能夠: //cmd = data & 0xFF; data = data >> 8; } } unsigned int get_32(unsigned char *cmd) { unsigned int ret; int i; for (ret = 0, i = SIZE_OF_UNSIGNEDINT - 1; i >= 0; --i) { ret = ret << 8; ret |= cmd; } return ret; } int main(void) { unsigned char cmd[SIZE_OF_UNSIGNEDINT]; unsigned int data, ret; unsigned char *p; int i; data = 0x12345678; printf("data = %x\n", data); // 以字節爲單位打印出數據 p = (unsigned char*)(&data); for (i = 0; i < SIZE_OF_UNSIGNEDINT; ++i) { printf("%x", *p++); } printf("\n"); // 以相反的順序存放到cmd之中 put_32(cmd, data); for (i = 0; i < SIZE_OF_UNSIGNEDINT; ++i) { printf("cmd[%d] = %x\n", i, cmd); } // 再以相反的順序保存數據到ret中 // 保存以後的ret數值應該與data相同 ret = get_32(cmd); printf("ret = %x\n", ret); p = (unsigned char*)(&ret); for (i = 0; i < SIZE_OF_UNSIGNEDINT; ++i) { printf("%x", *p++); } printf("\n"); return 0; }