下面这个代码演示了CPU是采用大端法还是采用小端法
int main()
{
union MyUnion
{
int a;
char b;
};
MyUnion mu;
mu.a = 1;
if (mu.b == 1) {
printf("xiaoduan");
}
if (mu.b == 0) {
printf("daduan");
}
}
大端法小端法:这个概念属于CPU存数据时候的概念,也就是说CPU往内存中存数据的时候,是采用大端法往内存中存数据,还是小端法往内存中存数据
大端法:存的时候,会先把数值的高位存到内存的低位
小端法:存的时候,会先把数值的低位存到内存的低位
大端法的大,指的是数值的高位,小端法的小,指的是数值的低位
不同的CPU方式不同,以前英特尔都是小端,AMD都是大端,现在的CPU几乎大端小端都支持,前提是需要我们指定大端还是小端,目前在我的电脑酷睿I7上默认是小端法
上述代码中定义了一个联合体,那么当代码走完mu.a = 1;的时候,内存如图
其中黄色表示char b所在的位置,因为读取的时候一定是从内存低位置读取,所以读取的时候一定先读取0x0000地址,当该地址是0,那么就是大端法,该地址是1,那么就是小端法
内存读取:在一块连续的内存中,CPU总是先读取低位置的内存,后读取高位置的内存
内存最小单位:众所周知,最小单位是bit,但是我个人觉得如果把最小单位理解成bit,将是一个学习的障碍,不如干脆认为内存最小单位是byte,因为所有语言,基本数据类型都是byte组成的,我们没人听说过XXX的大小是0.5字节这样的话吧???当然,有些人可以说位运算,但是位运算之后,我们处理结果的时候,多数还是对字节操作