关于大小端以及位移运算说明
1、首先,要知道位移运算只能用于char和int两个数据类型(即使是char和int两个数据类型的数组也不行),像float、double等用不了。
位移运算里说的如左移,它指数值里的位数从低位向高位移动(如从个位移到百位。ps:我们书写习惯是高位在左边,低位在右边),无论该数值是以小端还是大端形式存储的(即移动方向不是从内存地址角度上看的。小端存储时,数值中的低位存在内存(或其他存储器)上的低地址处,又我们画内存地址习惯是低地址在左边,高地址在右边,这样,数值上的左移,在内存地址角度上看其实是右移的)。
注释:
位移运算可以运用于大小端转换。
2、
无论是在大端还是小端的CPU上运行如下片段:
char *p=“abcd”;cout<<*p<<"---"<<*(p+1)<<"---"<<*(p+2)<<"---"<<*(p+3)<<endl;
输入的结果都是:
a---b---c---d
原本以为在小端上输入的结果是:d---c---b---a
也就是说,大小端字序只能影响一个基本数据类型(如float)内部的存储顺序,而不能影响其数组中各个元素间前后(或者其所在结构体、类等复合数据类型整体)的存储顺序。
3、对于字符,大小端字序是以字符为单位影响一个字符内部编码值的存储顺序的,而不是以char数据类型:
例如,A的ascii码值为0X31,Unicode编码值(UTF16LE)为0X 00 31。
小端的CPU上运行如下片段:
char *p=“A”;
char *pD=stringtoUnicode(p);//stringtoUnicode将ascii码值转换为Unicode编码值,封装了iconv库
结果
注释:
与“如何查看float数据类型在内存空间里的原值”相关的知识
1、char t=-5;
int tmp=(int)t;//char类型负整数转化为int类型负整数时高位会补1
cout<<*((unsigned int*)tmp)<<endl;//这个从以unsigned int形式输出tmp在内存空间里的原值可以看出。
unsigned char或是unsigned int可以用来查看其对应signed char或是signed int在内存空间里的原值以形式。*((unsigned int*)tmp)
2、有符号整型的负整数(如)是不能正确强制转化()为无char t=-5;tmp=()t;unsigned int unsigned int符号整型的,因为无符号整型表示的范围不含负整数。
大小端格式的作用对象或说作用范围是在(一个数组里的元素这个层次上)属于基本数据类型的变量(或叫元素)进行字序颠倒,而不是该变量所在的数组这个层次上进行字序颠倒。
所以,memcpy(int dest,char scr,1)会由于变量dest的大小端存储格式不同而将scr的值拷贝到dest上的低地址或高地址上,dest其余未被复制的区域保持原值不变。memcpy(char dest[4],char scr,1)则始终是拷贝到dest上的低地址上,其余也保持原值不变。
大端 小端 百度
http://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html大端 小端 转换 baidu
http://www.cnblogs.com/Romi/archive/2012/01/10/2318551.htmlhttp://blog..net/songqingxi/article/details/6305196
大端 小端 拷贝 代码 百度