c语言 - 将int16_t存储在uint64_t中



所以我有 4 个uint16_t,我正在尝试将它们存储在一个uint64_t中。我想我有这个工作。

uint64_t encode(int16_t A, int16_t B, int16_t C, int16_t D){
    return (uint64_t)((uint16_t) A) << 48
         | (uint64_t)((uint16_t) B) << 32
         | (uint64_t)((uint16_t) C) << 16
         | (uint64_t)((uint16_t) D) <<  0;
}
int main(){
    int16_t A1 = -32000;
    int16_t B1 = -31000;
    int16_t C1 = 16004;
    int16_t D1 = 16007;
    uint16_t A2 = 32000;
    uint16_t B2 = 15000;
    uint16_t C2 = -4;
    uint16_t D2 = -7;
    uint64_t E = encode(A1, B1, C1, D1)
               + encode(A2, B2, C2, D2);
    printf("%dn", (int16_t)((E >> 48)));
    printf("%dn", (int16_t)((E >> 32)));
    printf("%dn", (int16_t)((E >> 16)));
    printf("%dn", (int16_t)((E >>  0)));
}

我已经能够编码 4 个int16_t,然后使用这种方法将它们取回。现在,我想将两个编码形式加在一起,解码它们,然后回到原始操作。我似乎被 1 个错误弄得一堆。

我这里的输出是 0、-15999、16001、16000。两个输出正确(0 和 16000),两个输出偏差 1。

我会注意到我试图首先将int16_t转换为uint16_t(添加 32768),但没有运气。

你从一个号码到下一个号码。就像你把十进制数编码19 19一样,23编码为23,然后将它们加在一起:19 + 23 = 42,但1 + 2 = 3。所以顶部的数字是"一"。

即使您想避免完全解包,您仍然可以执行以下操作:

result = 
  ((a&0xffff0000ffff0000 + b&0xffff0000ffff0000) & 0xffff0000ffff0000) |
   (a&0x0000ffff0000ffff + b&0x0000ffff0000ffff) & 0x0000ffff0000ffff))

。分两步作用,避免不适当的携带。

相关内容

  • 没有找到相关文章

最新更新