字节序

来源:互联网 发布:淘宝部门及职能 编辑:程序博客网 时间:2024/05/22 14:44



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
原创粉丝点击