mips32和x86下的大小端模式判定

一.背景

1.1 mips32搭载32bit vxworks操作系统

1.2 x86搭载64bit windows10操作系统

二.大小端模式判定前的准备

2.1 先要知道各种架构上各种整型数占据的bit数,也就是通过范围来确定bit数

上一篇已经讲过,特奉上地址如下:

http://www.cnblogs.com/dakewei/p/7690847.html

2.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 ",*p,p,ul,&ul);

}

运行结果如下:

*p = 1,p = 0x80cf3fcb,ul = 1,&ul = 0x80cf3fc8  

对运行结果进行分析如下:

先回忆大小端的定义:

大端模式: 低位数据存储在高地址

小端模式:低位数据存储在低地址

那么内存中数据的存放情况如下:

                   -------------------

0x80cf3fc8  |    0x00         |

     --------------------

0x80cf3fc9  |    0x00         |

        --------------------

0x80cf3fca |      0x00        |

                  --------------------

0x80cf3fcb |     0x01         |

                  --------------------

由此可以判定:笔者的mips32机器是大端机器(笔者的这台mips32机器是可以设置大小端的)

2.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 ",*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机器是小端机器

原文地址:https://www.cnblogs.com/dakewei/p/7699429.html