FastDFS中long2buff解析笔记

long2buff解析笔记

在阅读fastdfs中遇到了long2buffer函数,对于里面的位移操作以及unsigned char* 操作感觉很迷茫> 查找资料后总结如下:

void long2buff(int64_t n, char *buff)
{
unsigned char *p;
p = (unsigned char *)buff;
*p++ = (n >> 56) & 0xFF;
*p++ = (n >> 48) & 0xFF;
*p++ = (n >> 40) & 0xFF;
*p++ = (n >> 32) & 0xFF;
*p++ = (n >> 24) & 0xFF;
*p++ = (n >> 16) & 0xFF;
*p++ = (n >> 8) & 0xFF;
*p++ = n & 0xFF;
};


1.int与char,unsigned char之间相互赋值:

    char字面解释,有符号字符型,当用char对int进行赋值时,系统认为最高位是符号位,赋值的时候,就会对最高位进行扩展。
    unsigned char 字面解释,无符号字符型,当用unsigned char对int赋值时,系统就不会进行扩展。     
    由于unsigned char类型的变量只有一个字节,表示范围:0~255,char 只有一个字节,表示范围:-128~127。
    而int类型有4个字节(32位系统下)取值:-2147483648 ~ +2147483647.
    unsigned int取值范围: 0 ~ 4294967295(4 Bytes) 
    char只有一个字节,int有4个字节, 当把int 变量赋值给 char变量时会发生截断,截断的是unsigned int的(大端下)高位的三字节部分。

1.移位操作:<<左移,>>右移:

    <<表示向左移位:n<<1就是左移1位,

    原来      | 移位后
    -------- | ---
    00011001 | 00110010

    >>表示向右移位:n>>3就是右移1位.

    左边的移除,右侧补零,相当于/2.
        原来  | 移位后
    -------- | ---
    00011000 | 00001100

1.解析long2buffer:

1.*p++ = (n >> 56) ,移位56位,n变量是64位,右移56位,移动56位,*p++=(n>>48)….*p++(n >> 8) ,这一段话相当于将高8位移位至低8位。也就是移动一个字节
2. & 0xFF,0xFF是16进制,转换为2进制:1111 1111。主要是验证作用
3. & 操作,1&0=0,1&1=1,0&0=0,目的,截断低8位前面的数据。
4. (p)指向第一个unsigned char 数组,*p则是指向的值,‘’和’++’的优先级是相同的,结合是由右到左,所以,P++==(p++),此时还没有到‘;’,语句没结束,p还是指向的第0个,是指向的第一个,到分号后,p的值就是+1,后的了。
这句话的意思是:将n取最高位8个字节,进行验证(&0xFF),后赋值给p指向的第一块unsigned char内存。
到最后结束后,p指向的是第9块内存。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值