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;
}