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

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.csdn.net/songqingxi/article/details/6305196

大端 小端 拷贝 代码 百度

linux大端,小端,网络字节序转换之可移植性代码

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值