mips32和x86下的大小端模式判定
一.背景
1.1 mips32搭载32bit vxworks操作系统
1.2 x86搭载64bit windows10操作系统
二.看图
三.大小端模式判定前的准备
3.1 先要知道各种架构上各种整型数占据的bit数,也就是通过范围来确定bit数
上一篇已经讲过,特奉上地址如下:
http://www.cnblogs.com/dakewei/p/7690847.html
3.2 mips32上的判定
代码如下:
#include <stdio.h>
void main(void)
{
unsigned long int ul = 1;
unsigned char *p = &ul;
p += (sizeof(unsigned long) - 1); /*因为mips32上unsigned long 类型占据了32个bit,因此移动3个字节,以便到达最后一个字节*/
printf("*p = %d,p = %p,ul = %d,&ul = %p\n",*p,p,ul,&ul);
}
运行结果如下:
*p = 1,p = 0x80cf3fcb,ul = 1,&ul = 0x80cf3fc8
对运行结果进行分析如下:
先回忆大小端的定义:
大端模式: 低位数据存储在高地址
小端模式:低位数据存储在低地址
那么内存中数据的存放情况如下:
-------------------
0x80cf3fc8 | 0x00 |
--------------------
0x80cf3fc9 | 0x00 |
--------------------
0x80cf3fca | 0x00 |
--------------------
0x80cf3fcb | 0x01 |
--------------------
由此可以判定:笔者的mips32机器是大端机器(笔者的这台mips32机器是可以设置大小端的)
3.3 x86上的判定
代码如下:
#include <stdio.h>
void main(void)
{
unsigned long int ul = 1;
unsigned char *p = &ul;
p += (sizeof(unsigned long) - 1); /*因为x86上unsigned long 类型占据了64个bit,因此移动7个字节,以便到达最后一个字节*/
printf("*p = %d,p = %p,ul = %d,&ul = %p\n",*p,p,ul,&ul);
}
运行结果如下:
*p = 0,p = 0xffffcc07,ul = 1,&ul = 0xffffcc00
对运行结果进行分析如下:
先回忆大小端的定义:
大端模式: 低位数据存储在高地址
小端模式:低位数据存储在低地址
那么内存中数据的存放情况如下:
-------------------
0xffffcc00 | 0x01 |
--------------------
0xffffcc01 | 0x00 |
--------------------
0xffffcc02 | 0x00 |
--------------------
0xffffcc03 | 0x00 |
--------------------
0xffffcc04 | 0x00 |
--------------------
0xffffcc05 | 0x00 |
--------------------
0xffffcc06 | 0x00 |
--------------------
0xffffcc07 | 0x00 |
--------------------
由此可以判定:笔者的x86机器是小端机器