测试大端存储还是小端存储(C)

  • 内容
  • 相关

一、大小端模式

    大端模式是指将数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。


    小端模式是指将数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

二、为什么会有大小端模式之分?

    这是因为在计算机系统中,是以字节为单位存取数据的,每个地址单元都对应着一个字节,一个字节占8bit。但是在C语言中除了 8bit 的 char 之外,还有 16bit 的 short 型,32bit 的 int 型、long 型(当然这要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,这就存在着一个如何安排多个字节的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bitshortx,在内存中的地址为0x0010x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。X86结构是小端模式,而KEIL C51是大端模式。很多的ARMDSP都为小端模式。并且有些 ARM 处理器是可以随时在程序中(在ARM Cortex 系列使用REV、REV16、REVSH指令)进行大小端切换的。

三、使用指针验证是大端存储还是小端存储

源程序:

#include <stdio.h>
int main(int argc, char *argv[])
{
	int a = 100,i=0;
	char *p = NULL;

	p = (char *)&a;  //&a是个整形变量,类型不匹配,转换一下

	for(i=0; i<sizeof(int); i++,p++)
	{
		printf("addr = %p value = %d\n",p,*p);
	}
	return 0;
}

程序输出:

addr = 0x7ffe136ba838  value = 100
addr = 0x7ffe136ba839  value = 0
addr = 0x7ffe136ba83a  value = 0
addr = 0x7ffe136ba83b  value = 0

程序解析:

    1)首先程序执行到 int a = 100;  在栈区开辟出一块内存空间,存放int4字节)型数据100

    2)char *p = NULL;  在栈区取出一块内存空间(1字节),取名为p,放0x0000
    3)p = (char *)&a;  是 int 类型的,&a 把 int 型内存地址拿出来。而 char *型指针变量,而赋值号“=”左右两边类型要一致。所以要使用(char *)强制类型转换一下。char *只能指向一个字节的内存空间,int型数据占4个字节。
    3)

for(i=0; i<sizeof(int); i++,p++)
{
	printf("addr = %p value = %d\n",p,*p);
}
        使用for循环遍历个字节中存的东西。p++ 是 char * 类型的,占一个字节,所以每自加一次移动一个字节的位置。

    这里使用 char * 型指针,而不用 int *,是因为 int 占 个字节,每自加一次,移动4个字节的位置,那就不是我们所要找的地方了。

本文标签:

版权声明:若无特殊注明,本文皆为《尤尤》原创,转载请保留文章出处。

本文链接:测试大端存储还是小端存储(C) - https://www.yxfseo.cn/post-170.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注