C语言中整形的大小端存储
1.案例引入
2.大小端存储
2.1大端存储
2.2小端存储
2.3为什么会有大端小端
3.判断机器的字节序
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*,再解引用,就取出了第一个字节