不同类型的CPU和操作系统对多字节数据例如int、short、long的存储方式可能不一样,分为大端存储和小端存储
这里所说的多字节是指连续的多字节数据,也即多字节数据作为一个整体的时候。对于字符串或者数组存储多字节数据的时候,例如char s[6] = "hello";
不论是大端或者是小段存储,h
一定在地址的第一位
对于小端存储的主机 数据低位存储在地址低位
对于大端存储的主机 数据低位存储在地址高位
下图距离以16进制(0x)为例,因为两位正好对应一个字节。
在这里用一个简单的程序,判断所使用的主机是大端存储还是小端存储
1 #include <stdio.h>
2 int main(){
3 int a = 0x12345678;
4 char *p = (char *)&a; //*p只能操作一个字节 存储的是地址低位0x78
5 if(0x78 == *p){
6 printf("小端\n");
7 }else if(0x12 == *p){
8 printf("大端\n");
9 }
10 return 0;
11 }
请思考:
小端存储的主机上,下面的代码会输出什么?
1 int m = 0x41424344;
2 printf("%s\n", &m);//DCBA+不确定的
在这里涉及到的知识点:大小端存储问题、16进制数据如何存入内存、16进制如何转换成10进制、常见字符对应的ASCII码(十进制 65对应A)、printf(“%s\n”,&m)对应输出字符串要的是首地址(从首地址到\0结束),取地址&num取的是编号最小的首地址
将数字以字符的形式输出会输出这个数字对应的ASCII码(对应的字符),这里将十六进制转化为十进制是因为我们需要记住十进制的ASCII码对应的字符。