码迷,mamicode.com
首页 > 其他好文 > 详细

字节序问题

时间:2014-09-07 22:35:56      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:style   color   io   ar   strong   数据   问题   sp   代码   

     1. 在设计计算机时,有两个不同的体系结构来处理内存存储区,他们被称为大字节序和小字节序。字节序是一个处理器架构特性,用于指示像整数这样大数据类型的内部字节顺序。几乎所有的机器上,多字节对象都被存储为连续的字节序列 运行在同一台电脑上的进程在在英特尔的计算机上,低位字节被优先存储。这意味着像 0x1234 十六进制单词存储作为 (0x34 0x12) 在内存中。对于四个字节的值 ;例如,0x12345678 将存储为 (0x78 0x56 0x34 0x12)。"较大的一端在"这样做是以相反的方式,因此 0x1234 作为 (0x12 0x34) 存储在内存中。

    2. 类比一下,其实这个字节序跟我们书写方式差不多。我们可以把一行的开始当作内存的低地址,在书写数字的时候我们会把高位写在前面,这就是人类的存储方式。对于计算机来说也一样,它同样需要一种存储方式,先存低位(小端)或者先存高位(大端)。可以看出,人类的书写方式相当于计算的大端存储。

    3.什么时候要考虑字节序问题呢? 

      再拿我们书写方式举例。我们自己写的字怎么看,代表什么意思我们肯定很清楚。但是如果你是个天才,书写时总是先写低位,我想一般人肯定会误解。对计算机也一样,不同的cpu可能有不用的字节序,所以在不用cpu之间处理数据时难免会被误解。综上,当要在不同计算机(cpu)之间处理数据时,一定要考虑字节序问题。

    4.如何判断当前机器的字节序呢?

     一个简单的办法是,给一个整数赋个值0x04030201。然后让一个char类型的指针指向这个整数,打印这个char,就可以知道字节序了。代码如下

#include <stdio.h>
int main(void)
{
    int iNum = 0x04030201;
    char *pcNum = &iNum;
    
    if (*pcNum == 0x04)
       puts("big edum\n");
    else if (*pcNum == 0x01)
       puts("small edum\n");

    return 0;
}

附上一个记忆口诀:低地址存低位为小端,低地址存高位则大端。

字节序问题

标签:style   color   io   ar   strong   数据   问题   sp   代码   

原文地址:http://my.oschina.net/uindows/blog/311426

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!