关于位运算的左移右移和字节序

有几点需要注意:
1.弄清操作数究竟是谁
例如:
0x01<<8; 0x0101<<8
第一个操作数是0x01; 第二个操作数是0x0101,这里0x0101当做一个整体向右移动.

再如:
char buf[4]=“abc”;
int num=0;
num=buf[0]; // num=97; 仅buf[0]作为num的低位字节填充num的第一个字节.和buf中的其它元素无关.
num=buf[0]<<8; // num=24832;先将buf[0]左移8位,得到 0110 0001 0000 0000, 然后将这两个字节填充 // 到num的前两个字节.低位字节填充到低地址位. 注意这里的操作数仅仅是buf[0]! // 那么buf[0]左移了,是否buf[1]和后面的元素都跟着左移呢?
// 答案是否定的.否则不就变成buf[1]<<8了? 而我们求的是buf[0]<<8呀.
// 所以buf[0]左移与buf[1]以及后面的元素都没有关系!!!

2.关于字节序
只有整体数据格式大于一个字节才存在字节序问题.所谓的整体数据格式是指数据完整的存储形式.
例如:int是由4个字节组成的,少于4个字节就无确定这个int类型的数到底是几.
而char是由1个字节组成的,只要够一字节,就可以确定这个char类型的数到底是几.
而字节是计算机最小的存储单位,所以,只有整体存储格式大于一个字节的数据才有字节序问题.
所以我们在网络传输数据时,通常都使用string/char/char buf[],这些形式的数据都不存在字节序问题!

举个例子:
string str=“abc”;
可以理解为:不论是大端机器还是小端机器,他们的内存增长方向都是相同的.
那么不论在什么地方传输或存储,只要按照原数据顺序发送和接收,都是str[0]=‘a’ / str[1]=‘b’ / …
也就是说,每个地址都存放着一个可以确定的数,不存在低位字节和高位字节之说,只需要一个字节一个字节的按顺序取出数据即可.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值