转移时奇怪的行为

时间:2016-10-28 11:02:05

标签: c++ bit-shift

当我使用赛普拉斯的SDCard库写入SD卡时,我遇到了一些挑战。因为我必须加速一切,所以使用sprintf()和类似的东西是不可能的。

该库只允许我用uchars或字符串写入SD卡。不幸的是,我的值都是int16_t。所以这就是出现问题的地方:

int16_t  ax = -15000;
         ay = -10000; 
         az = -32760;
         gx = 32760;     
         gy = 25000; 
         gz = 10;    
         mx = -10;
         my = 20;
         mz = 0;

// Then I put it into an array

char suma[] = {
    ((uint16_t) ax) & 0xff,
    ((uint16_t) ax) >> 8,
    ((uint16_t) ay) & 0xff,
    ((uint16_t) ay) >> 8,
    ((uint16_t) az) & 0xff,
    ((uint16_t) az) >> 8,

    ((uint16_t) gx) & 0xff,
    ((uint16_t) gx) >> 8,
    ((uint16_t) gy) & 0xff,
    ((uint16_t) gy) >> 8,
    ((uint16_t) gz) & 0xff,
    ((uint16_t) gz) >> 8,

    ((uint16_t) mx) & 0xff,
    ((uint16_t) mx) >> 8,
    ((uint16_t) my) & 0xff,
    ((uint16_t) my) >> 8,
    ((uint16_t) mz) & 0xff,
    ((uint16_t) mz) >> 8,
    0
};

当我检索数据时出错了。数据很好,直到gz。它显示10好,但其余的只是消失了。

将10更改为257消除了问题,-10很好,这意味着当我右移低非负值时会发生错误。

什么事?我希望你有一些见解:)

1 个答案:

答案 0 :(得分:1)

int16_t转换为uint16然后转换为char时,您可能最终会向库中发送null char(\ 0)。

库 - 只接受char[]string - 可能会将前者转换为c字符串,后者以null char结尾。意味着您最重要的字节(0x00)提前终止字符串。任何低于257的uint16都会在最重要的位置产生一个空字符。

e.g:

0000 0000 = [0, 0] = [0x00, 0x00]   // 2 null chars, only the first will get across
0001 0000 = [1, 0] = [0x01, 0x00]   // null char
                                    // ...
1111 0000 = [256, 0] = [0xff, 0x00] // null char
1111 0001 = [256, 1] = [0xff, 0x01] // not null char

尝试将char []显式地转换为std :: string并指定它的大小。例如:

std::string s("ab\0c", 4);