从小端大端问题剖析数据类型转化

 
在c#数据类型转化一文中提及了由int型转化为byte[]的一个方法,具体的实现如下:
int i=0x12345678;
byte[] result = new byte[4];
 
for(int pos=0;pos<4;pos++)
{
    byte[pos] = (byte)(i&0xff);
    i>>=8;
}
 
在程序中我们是将整数i进行右移操作,那我们可不可以用左移操作呢?
 
首先,我们做个测试的程序来看看结果。当然要进行左移操作的话,i就不能和0xff做与运算了,不然结果就是0。我们修改后的程序如下:
 
int i=0x12345678;
byte[] result = new byte[4];
 
for(int pos=0;pos<4;pos++)
{
    byte[pos] = (byte)(i&0xff000000);
    i<<=8;
}
 
System.Console.WriteLine("{0},{1},{2},{3}",byte[0],byte[1],byte[2],byte[3]);
 
调试运行,结果如下:
0,0,0,0
我们发现运行的结果全为0,为什么呢?
 
在讲原理之前,我们要先了解两个基本知识:
 
1.类型转化时的内存操作
当我们把一个int型强制转化为byte时,由于byte只有1个字节,而int型是4个字节,这样就会产生截断,int把它最低的内存空间里的值放到了byte所对应的内存空间里。如图所示:
   Byte型                     int
 **********             **********
 * 1 Byte * <-----------* 1 Byte *  低位
 **********             **********  |
                              * 1 Byte *     |
                               **********  |
                              * 1 Byte *     |
                               **********  |
                              * 1 Byte *  高位
                              **********
2.操作系统中大端序以及小端序的概念
有关于大端和小端的具体的细节我不想太多,有兴趣的可以到csdn技术文挡里搜索相关内容。下面用图示的方法简单介绍大端和小端。
例如:对于一个整数0x12345678它在两种模式下在内存的存储形式。
在小端序中的存放方式:
 **********
 *   78   * 低位
 **********  |
 *   56   *  |
 **********  |
 *   34   *  |
 **********  |
 *   12   * 高位
 **********
在大端序中的存放方式:
 **********
 *   12   * 低位
 **********  |
 *   34   *  |
 **********  |
 *   56   *  |
 **********  |
 *   78   * 高位
 **********
 
通过上面的介绍,大家应该对这个原理懂的差不多了,那我就抛砖引玉简要说明下:
在Windows操作系统下,数据的存放是按小端序的。当数据右移时是将高位的数据移动到低位的内存里,而左移是将低位的数据移动到高位中。而在数据类型转化的时候是将低位的数据开始存入目的内存中的,这就是为什么我们得到的数据是0的原因。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值