标签:小端 arr 存储 int unsigned 涉及 数组 printf 大小
涉及数组的大小端问题
一、什么是大小端?
对于十六进制数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 ;
}
标签:小端,arr,存储,int,unsigned,涉及,数组,printf,大小 来源: https://blog.csdn.net/qq_43259117/article/details/113754889
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。