大端小端的判定与运用

大端模式(Big_endian)这里写图片描述:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端模式(Little_endian):这里写图片描述:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

判定:

union A
{
    short m;
    char arr[2];
};

void test()
{
    A k;
    k.m = 0x0102;
    if (k.arr[0] == 1)
    {
        printf("k.arr[0] %d \n",k.arr[0]);

        printf("Big \n");
    }
    else
    {
        printf("k.arr[1] %d \n", k.arr[1]);

        printf("small \n");

    }
}

运用:

#include<stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};
    int *ptr1=(int *)(&a+1);
    int *ptr2=(int *)((int)a+1);

    printf("%x,%x",*ptr2,ptr1[-1]);

    return 0;
}

这里写图片描述

这里写图片描述

分析:
1.> int ptr2=(int )((int)a+1);
将a强制类型转换为int,假设a的地址也就是数组首元素的地址为0018ff44,则(int)a+1==0018ff45,在将其强制类型转换为指针,此时ptr2==0018ff45;
由上图可知,该地址的大小是从低—>高排列, 而我的编译器是以小端形式存储,故低位在放低地址,(在32位操作系统中,32位和64位系统中,编译器为了相互兼容,所以指针都是4个字节长度。)故而*ptr2为02 00 00 00;

2.>对于数组名存在两个方式不会发生降级的情况,一个是sizeof(数组名),此处指该数组的整个大小,另一个就是此处的&a,此时指数组的整个地址,和数组首元素的地址相同,如

int arr[5]={0};
int *pa=arr;
int *pb=&arr;
printf("%p\n%p\n",pa,pb);

这里写图片描述
既数组首元素的首地址和整个数组的首地址是相同的,但是当分别对arr和&arr+1之后,你会发现它们的地址就会不在相同,因为arr指数组的首元素,而&arr却指的是整个数组

int arr[5]={0,1,2,3,4};
int *pa=arr +1   ;
int *pb=&arr+1 ;
printf("%8d %d\n",*pa,*pb) ;
printf("%p %p\n",pa,pb);

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值