大小端存储与(char*)&含义

以下内容为自我之言,若有错误烦请指点。

1.内存中的十六进制表示

在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节为8bit即8个位,一个位是一个二进制数。用8个二进制位来表示一个字节显得太长,而用两个十六进制位就可以表示一个字节,这样显的更加简洁。如0X12表示十进制的数18。

2.为什么会有大小端模式之分呢?

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

2.1 Big-Endian大端存储

Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

2.2 Little-Endian小端存储

Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
举例:比如有十进制数257,转换成16进制是0X101。
tips:十进制转十六进制方法:
第一步:257/16=16余1;
第二步:16/16=1余0
第三步:1/16=0余1
这里写图片描述
如果在小端存储电脑里写如下代码

#include <stdio.h>
int main()
{
    int i = 258;
    int abd = 0Xff;
    char* p = (char*)&i;
    printf("%d\n", *p);
    p++;
    printf("%d\n", *p);
    p++;
    printf("%d\n", *p);
    p++;
    printf("%d\n", *p);
    return 0;
}

2
1
0
0
这里写图片描述
原因如下:
1.首先int i在内存中用十六进制表示为0x102,在内存中占四个字节,存储是小端存储。先将0x101中低地址位的0x02存在第一个字节,把高地址位的0x1_ _放在高一个地址的内存中。
低地址————–>高地址
0x02 | 0x01 | 0x000 | 0x000
2     1     0     0
2.(char*)&i表示的意思是将int类型的指针强制转换成(char*)类型的指针,这样原本指向四个字节的int指针变成了指向一个字节的char类型指针。&i表示取地址运算,但是地址算是一种指针

猜你喜欢

转载自blog.csdn.net/wu_qz/article/details/81037843