如何区分大端和小端以及int*,char*,short*的本质区别

所谓大端:内存低地址存储数据高位数值
所谓小端:内存低地址存储数据低位数值

大端模式更符合人的阅读习惯

如大端模式十六进制数据 0x04,变成字符串表示存储时,
0是存储在数组下标小的位置,4存储在数组下表高的位置。

string value =[2];

如何区分大端和小端以及int*,char*,short*的本质区别

我们知道char,short,int,指针,long  
在16位平台上
char 8位,
short 16位, 
int 16位,
指针 16位,
long 32位,

在32位平台上 
char 8位,
short 16位, 
int 32位,
指针 32位,
long 32位,
long long 64位 

在64位平台上 
char 8位,
short 16位, 
int 32位,
指针 64位,
long 64位,
long long 64位 

不同平台存储这些值得方式有所不同,存储方式有大端和小端模式,
关于大小端的由来,我就不多说了。 

下面我们来看看大端小端的识别和,int*,char*,short*,的基本区别 
 

#include <iostream>
using namespace std;
int main()
{
    /*定义16格式的int型数一枚*/
    int a = 0x12345678;      //其二进制为 0001 0010 0011 0100 0101 0110 0111 1000 

    short tx = (short)a;    //取出int型四个字节的最后16位的值,不论大小端模式存储,都是0x5678 
    cout<<tx<<endl;

    short b = *(short*)&a; 
    cout<<b<<endl;  
    /*可见输出结果是一模一样的,对于 short tx = (short)a; 很简单就是取出低16位的值,对于short b = *(short*)&a,这里先讲述一下
    short*的含义,表面上看short*是short类型的指针,short占2个字节,short*在内存中存储时占据4个字节,short*,int*,char*的本质
    区别在于使用*时候,取出地址中所存储的值。
    
    因为short占2个字节,所以 *(short*)执行步骤是取出short*的值,这个值是占据32位的一个地址,在执行*操作,
    *是从地址中取值,由于是short*的指针,说明了从起始地址(基本单位为1字节)开始,依次取出2个字节中存储的值,即 short b = *(short*)&a; 是取出从低位地
    址开始连续两个字节的值,如果是小端模式,那么从起始地址中取出的值就是0x5678,根据打印结果我们发现我的这个测试机是小端模式,
    
    总结:short*是在*(short*) 时候,是取出连续两个字节中的值,那么*(char*)的时候,便是取出地址中的值,不用在连续移位取值了,因为char是1字节,
    *(int*)的时候,是从首地址开始取出连续int型占据字节个数的字节数的值 
    */
    
    /*读到这里可能很好奇大端和小端有什么区别呢,
    大端模式就是在内存中高位存储低位字节的数值,小端模式就是在内存中低位存储低位字节的内容
    
    这两句话似乎难于理解或者很容易混淆,所以在这里举个例子,
    因为 a = 0x12345678;32位,4个字节,
    
    那么在小端模式中,加入存储a的起始地址值为:0x2345FF01,那么小端模式中存放方式:
    内存地址      字节值
    0x2345FF01     0x78
    0x2345FF02     0x56
    0x2345FF03     0x34
    0x2345FF04     0x12
    
    所谓的低位存储低位数据的值,就是起始一个字节存储的数据是数据的低位字节的值,数据的低位字节是最右一字节的为最低位 
    
    那么在大端模式中,加入存储a的起始地址值为:0x2345FF01,那么大端模式中存放方式:
    内存地址      字节值
    0x2345FF01     0x12    //低位地址存贮了数据的最高字节位 
    0x2345FF02     0x34
    0x2345FF03     0x56
    0x2345FF04     0x78
    所谓的高位存储低位数据的值,就是最后一个字节存储的数据是数据的低位字节的值,数据的低位字节是最右一字节的为最低位 
    */
    
    /*
    所以 short b = *(short*)&a;
    执行步骤为:
    首先,取出存储a值的32位的地址,4个字节,
    其次,转换为short*, 
    再次,*在取出地址中的值,这个值是2从地址开始,读取2个字节的长度的数值,
    如果是大端模式,首地址是低位存的是高位的值,高位值为1234,如果是小端模式 
    即后两个字节的值,后两个字节为0x5678,可见结果我这里是小端模式,大家不妨一试 
    */ 
   
    /*最后我们再来看一个例子,打印出int型数据的每个字节的数值的地址*/
    int i;
   // int num = 0x12345678;
    char* ptr = (char*) &a;
    for (int i = 0 ; i < 4; i++)
    {
        printf("%p\t%x\n", ptr, *ptr);
        ptr++;
    }
    
    system("pause");
    return 0;
} 

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zanglengyu

敲碗要饭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值