字节序



1、

unsigned int  a =0x01030507;

在内存中的表示如下:



在内存的低地址处0x003CF758 存储0x0507  在内存高地址处存储0x0103.


    unsigned int  c=0x04030201;


  变量c  最大存储0xff ff ff ff  字节。


2、

unsigned int  c=0x04030201; 在内存中的地址和内容 0x003DFA8C  01 02 03 04 .

unsigned short sh =*((unsigned short*)&c);

当对 变量c 先进行取地址符,然后禁止强制转换后的内存地址和内容 。0x003DFA80  01 02 cc cc

此时 sh的值为 0x0201.因为sizeof(unsigned short) =2.   c=513

&sh的地址和内容如下:


char ch =  *(char *)&c;

&ch 的地址和内容如下:

此时 ch变量的值为 0x0x   c=1

总结:在小端情况下, 强制转换时,如果从宽字节,转换到窄字节时,只会保留 sizeof(窄字节)长度的内存低地址的内容。


3、


unsigned int  c=0x04030201; //定义无符号变量 c    变量c高位字节为 0x0403  变量c地位字节为0x0201.

在内存地址和内存内容如下:


unsigned short sh =*((unsigned short*)&c);

对变量c  强制转换后   变量sh内存地址和内存内容如下:

因为 sizeof(unsigned short) 长度为2 . 只保留 低位字节内容 0x 02 01.  高位字节内容此时为0x cc cc.为脏数据。


unsigned int rawsh =*((unsigned int*)&sh);

对 sh 变量通过强制转换后,内存地址和内容如下:


此时,rawsh = 0xcccc0201  rawsh = 3435921921 此时通过地址来强制转换。内存中内容已经改变,高位地址数据已经为脏数据。

unsigned int rawsh2 =(unsigned int)sh2;

但是通过类型强制转换后,内存地址和内容如下:

rawsh2 = 513  rawsh2 = 0x00000201 此时值为513 高位地址被强制为零。没有脏数据。



    unsigned int  c=0x04030201;
    unsigned short sh =*((unsigned short*)&c);
    unsigned short sh2=(unsigned short)c;

    unsigned int rawsh =*((unsigned int*)&sh);
    unsigned int rawsh2 =(unsigned int)sh2;
    
    unsigned char ch =  *(unsigned char *)&c;
    char ch2=(unsigned char)c;

    unsigned char rawch =*((unsigned int*)&ch);
    unsigned char rawch2 =(unsigned int)ch2;





如果判断大小端:


unsigned short flag = 0x1234;  
    char e =  *(char *)&flag;  //通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于 取b等于a的低地址部分
    if(e==0x34)
    {
        //0x34 为低位字节. char e的取值为 flag的低位地址。如果低位字节放在低位内存上则为小端。
        cout<<"litte endian"<<endl;

    }
    else
    {
        cout<<"big endian"<<endl;
    }












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值