关于大小端以及位移运算说明

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.html

http://blog..net/songqingxi/article/details/6305196

大端 小端 拷贝 代码 百度

经验分享 程序员 微信小程序 职场和发展