(C语言中整形的大小端存储)
1.案例引入
众所周知,在IDE Visual studio中,调试后可以在内存窗口中看见程序中一些变量的地址以及值 我们这里将一个16进制数字
0x12345678
存到内存中
int main()
{
int a = 0x12345678;
return 0;
}
按下F10后进入调试,打开内存窗口,找到变量a
的地址,发现a
中值存储的是:78 56 34 12
存在内中的顺序好像倒置了,但又没完全倒置
所以这就需要了解内存中大小端存储的知识了。
2.大小端存储
十六进制数字的每一位占0.5字节,所以一个字节是十六进制数字中的两位。 在存储十六进制的数字时,以一字节为单位进行存储,也就是
0x12345678
会以12
,34
,56
,78
的分块形式存储在内存中
所以十六进制数字中这四个字节如何在内存中排序就是一个问题,也就有了大端小端的说法
2.1大端存储
- 大端存储也被称为大端字节序存储
- 大端存储就是把一个数据的低位字节的内容放到高地址处,高位字节的内容放到低地址处
2.2小端存储
- 小端存储也被称为小端字节序存储
- 小端存储就是把一个数据的低位字节的内容放到低地址处,高位字节的内容放到高地址处
所以,可以在内存窗口中看出,visual studio 这个IDE是采用的是小端存储 不同的IDE 会采用不同的存储方法
2.3为什么会有大端小端
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
3.判断机器的字节序
这里的思想是,如果将1放到内存中,其16进制表示为:0x 00 00 00 01 如果按照大端存储就是: 01 00 00 00 如果按照小端存储就是: 00 00 00 01 假如能够取出内存中的第一个字节,如果为1就是大端存储,如果不是1就是小端存储
#include <stdio.h>
int check_sys()
{
int i = 1;
return (*(char *)&i);
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
此程序最主要的点就是取出第一个字节里的内容 先取
i
的地址,在将i
的地址强制类型转换成char*
,再解引用,就取出了第一个字节
标签:小端,00,字节,int,存储,C语言,内存,整形 From: https://blog.51cto.com/u_16237630/7557318