1、所 谓 的 大 端 模 式 , 是 指 数 据 的 低 位 ( 就 是 权 值 较 小 的 后 面 那 几 位 ) 保 存 在 内存 的 高 地 址 中 , 而 数 据 的 高 位 , 保 存 在 内 存 的 低 地 址 中 , 这 样 的 存 储 模 式 有点 儿 类 似 于 把 数 据 当 作 字 符 串 顺 序 处 理 : 地 址 由 小 向 大 增 加 , 而 数 据 从 高 位往 低 位 放 ; 所 谓 的 小 端 模 式 , 是 指 数 据 的 低 位 保 存 在 内 存 的 低 地 址 中 , 而 数 据 的高 位 保 存 在 内 存 的 高 地 址 中 , 这 种 存 储 模
2、式 将 地 址 的 高 低 和 数 据 位 权 有 效 地结 合 起 来 , 高 地 址 部 分 权 值 高 , 低 地 址 部 分 权 值 低 , 和 我 们 的 逻 辑 方 法 一 致 。为 什 么 会 有 大 小 端 模 式 之 分 呢 ? 这 是 因 为 在 计 算 机 系 统 中 , 我 们 是 以 字节 为 单 位 的 , 每 个 地 址 单 元 都 对 应 着 一 个 字 节 , 一 个 字 节 为 8bit。 但 是 在C 语 言 中 除 了 8bit 的 char 之 外 , 还 有 16bit 的 short 型 , 32bit 的 long型 ( 要 看 具 体 的 编
3、译 器 ) , 另 外 , 对 于 位 数 大 于 8 位 的 处 理 器 , 例 如 16位 或 者 32 位 的 处 理 器 , 由 于 寄 存 器 宽 度 大 于 一 个 字 节 , 那 么 必 然 存 在 着 一个 如 何 将 多 个 字 节 安 排 的 问 题 。 因 此 就 导 致 了 大 端 存 储 模 式 和 小 端 存 储 模 式 。例 如 一 个 16bit 的 short 型 x, 在 内 存 中 的 地 址 为 0x0010, x 的 值 为0x1122, 那 么 0x11 为 高 字 节 , 0x22 为 低 字 节 。 对 于 大 端 模 式 , 就 将0x11 放
4、 在 低 地 址 中 , 即 0x0010 中 , 0x22 放 在 高 地 址 中 , 即 0x0011 中 。 小端 模 式 , 刚 好 相 反 。 我 们 常 用 的 X86 结 构 是 小 端 模 式 , 而 KEIL C51 则 为 大端 模 式 。 很 多 的 ARM, DSP 都 为 小 端 模 式 。 有 些 ARM 处 理 器 还 可 以 由 硬 件 来选 择 是 大 端 模 式 还 是 小 端 模 式 。 下 面 这 段 代 码 可 以 用 来 测 试 一 下 你 的 编 译 器 是 大 端 模 式 还 是 小 端 模 式 :short int x; char x0,x1;
5、 x=0x1122; x0=(char*) /低 地 址 单 元 x1=(char*) /高 地 址 单 元 若 x0=0x11,则 是 大 端 ; 若 x0=0x22,则 是 小 端 上 面 的 程 序 还 可 以 看 出 , 数 据 寻 址 时 , 用 的 是 低 位 字 节 的 地 址 。 编 辑 本 段 linux 操 作 系 统 中 对 大 小 端 的 判 断 :static union char c4; unsigned long l; endian_test = l, ?, ?, b ; #define ENDIANNESS (char)endian_test.l) (如 果 ENDIANNESS=l表 示 系 统 为 little endian,为 b表 示 big endian )。 编 辑 本 段 使 用 C 语 言 判 断 处 理 器 的 大 小 端1int checkCPU() union w int a; char b; c; c.a = 1; return (c.b = 1);