查看原文
其他

涨知识!C语言中大端、小端字节序各自优势及判断

嵌入式ARM 2021-01-31

来源 :今日头条@小智雅汇


我们知道:

数据:高位→低位,如0x04030201,04是高位,01是低。
内存:低地址→高地址,如0x00000000→0xFFFFFFFF。

另外,计算机是按字长(如32位、64位)来访问内存数据的,而内存是按字节为单位来存储和编址的。

对于32位机,int = 0x04030201需要4个字节来存储,首字节(低地址)是存储04还是01呢?
存储04(高位)的称为大端CPU,存储01(低位)的称为小端CPU。

小端字节序优势↓

大端字节序优势↓

因为字节序可能存在的问题↓
如何判断自己电脑是采用的大端还是小端?

#include <stdio.h>#include <stdlib.h>void Endian(){ int val = 0x04030201; char firstByte = *(char*)&val; printf("%x",&val); if(firstByte==0x01) printf("Little-Endian(小端):首地址存储数据的低位\n"); if(firstByte==0x04) printf("Big-Endian(大端):首地址存储数据的高位\n"); char* p = &firstByte;}int main(){ Endian();
int val = 0x41424344; FILE* fp; if((fp=fopen("test.txt","wb"))==NULL) return 0; fwrite(&val,sizeof(val),1,fp); fclose(fp); system("type test.txt"); //DCBA(小端CPU)
if((fp=fopen("test.txt","rb"))==NULL) {printf("ss"); return 0;} unsigned char buf[1024]; if((fread(buf,sizeof(unsigned char),1024,fp))!=0) { int readVal = *(int*)&buf; printf("\n%x\n",readVal); // 41424344
} fclose(fp);
system("pause"); return 0;}/*Little-Endian(小端):首地址存储数据的低位DCBA41424344*/


-END-


推荐阅读

【01】在单片机(MCU)上运行Qt?Qt for MCUs 1.0正式发布【02】手把手教你如何把C++的源程序改写成C语言【03】C语言、嵌入式位操作精华技巧大汇总【04】手把手教你嵌入式C语言优化技巧【05】用C语言编程,如何节省存储空间?



免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存