涉及数组的大小端问题

涉及数组的大小端问题

一、什么是大小端?

对于十六进制数0x12345678,其在内存中表示如下表:
| | 0x4000 |0x4001|0x4002|0x4003z|
|–|–|–|–|–|–|
| 大端| 0x12|0x34|0x56|0x78|
|小端|0x78|0x56|0x34|0x12|
可以得出大小端的概念:

大端:高位存储在低地址,低位存储在高地址。
小端:高位存储在高地址,低位存储在低地址。

二、如何判断大小端

大小端举例:

int main()
{
unsigned char arr[]={0x12,0x34,0x56,0x78};
int i = *(unsigned*)arr;
printf("%x", i);
}
/*输出结果为78563412,char数组占4个字节,
可理解(0x12345678),转成unsigned(4字节)
后由于是小端存储,所以高位的12会存储在地址的高位,
低位的78则存储在低位。打印结果从低到高取值为78563412*/

如果将数组的地址打印出来:

unsigned char arr[]={0x12,0x34,0x56,0x78};
printf("%x\n",&arr[3]);//62fe13
printf("%x\n",arr[3]);//78
printf("%x\n",&arr[2]);//62fe12
printf("%x\n",arr[2]);//56
int i = *(unsigned*)arr;
printf("%x", i);
/*
打印结果发现78存储到了高地址,他不是应该存储在低地址吗?
实际上,数组的存储是从左到右的,也即是先存放12,再存放78。而unsigned类型(长度大于1字节)的存储则符合小端原则。
*/

为了理解大小端在举一个例子:

#include<stdio.h>
int main()
{
	char array[] = {2, 2, 3, 4};
	unsigned a=*(unsigned long*)array;
	printf("%x\n",a);
	//十进制为67305986,十六进制为4030202
}

| | 0x4000 |0x4001|0x4002|0x4003z|
|–|–|–|–|–|–|
|小端|0x04|0x03|0x02|0x02|

按照小端模式打印结果为4030202

判断大小端可以使用共用体,也可以使用指针,这里只介绍指针

#include <stdio.h>  
#include <stdlib.h>
//用指针的方式检测机器的大小端模式
int small_port()
{
	int a = 12 ; 
	char b = *((char *)(&a)) ;
	return b ;
}
int main(void)
{
	int i = small_port();
	if(12== i)
		printf("小端模式\n");
	else
		printf("大端模式\n");
	return 0 ;	
} 
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值