C ++:如何将32位数据转换为带符号整数

时间:2019-06-12 14:01:47

标签: c++ binary

在我的个人C ++库中,我编写代码以通过处理单个字节来处理在不同字节序系统(大小)上的工作。例如,我使用指向uint16数据开头的指针作为函数的参数,如下计算一个16位无符号整数:

constexpr uint16_t decode16(const uint8_t* x) {
    return uint16_t(x[1] + x[0] * 0x100);
}

实际上,此功能不适用于16位带符号整数的字节数据,因此0xFF被解码为-257。 有人可以教我如何为有效的有符号整数编写类似的函数吗? 0xFF应该解码为-1。

编辑:这是我的临时解决方案,它是小端系统的一种解决方法,但是无法移植到大端系统上。我正在寻找的是如何为两者进行编码。

int16_t decode16(const int8_t* x) {
    int8_t temp8[2];
    temp8[0] = x[1];
    temp8[1] = x[0];
    int16_t temp16 = *(uint16_t *)&temp8[0];
    return temp16;
}

1 个答案:

答案 0 :(得分:-1)

好的,所以这就是我最终做的方式。希望它可以帮助任何喜欢采用类似方法的人。基本上,一点一点地:

int16_t decode16(const int8_t* x) {
    std::bitset<8> firstbyte(x[0]);
    if (firstbyte[7] == 0) { // if positive integer, than treat as normal
        return int16_t(x[1] + x[0] * 0x100); 
    } else { // if negative integer, I assumed it's in Signed 2's Complement form (http://www.cs.umd.edu/~meesh/cmsc411/local-notes/numbers/node5.html)
        std::bitset<8> secondbyte(x[1]);
        std::bitset<16> tempset;
        // first copy all the bytes into a 16bit long bitset
        for (int i = 0; i < 16; i++) {
            if (i < 8) {
                tempset[i] = secondbyte[i];
            } else {
                tempset[i] = firstbyte[i-8];
            }
        }
        tempset.flip(); // then flip all bits

        // then add 1
        for (int i = 0; i < 16; i++) {
            if (tempset[i] == 0) {
                tempset[i] = 1;
                for (int j = (i-1); j>=0; j--) {
                    tempset[j] = 0;
                }
                break;
            }
        }

        int16_t answer = 0;
        for (int i = 0; i < 16; i++) {
            int16_t multiplier = 1;
            for (int j = 0; j<i; j++) {
                multiplier = multiplier*2;
            }
            answer = answer + tempset[i]*multiplier;
        }
        return answer*(-1);
    }
}