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库
结果