涉及数组的大小端问题
一、什么是大小端?
对于十六进制数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 ;
}