如何在 C 中将 10 位符号整数转换为 16 位整数

How to cast 10 bit sign integer to 16 bit integer in C

我正在解析一个 10 位有符号整数的数据。由于表示此数据的唯一方法是使用 int 或 short(用于符号 2 字节表示),因此我必须将 10 位转换为 16 位。 我已经应用了 2 种方法,但它们要么很慢,要么取决于编译器。

慢的方法是使用pow()函数

value = pow(2,16) - pow(2,10) + value

依赖于编译器的方法是

 value = (value << 6) >> 6 (right shift shifts the MSB which is a compiler dependent operation and may shift 0 if compiler is different)

谁能帮我找到将非标准类型转换为标准类型的标准方法

value = value & 0x03FF; //mask off the high 6 bits like you want.

不应有 10 位整数,我假设值是短整数,但您应该添加相关信息。

编辑 如果您只想屏蔽第 10 位,则:

value = (value & 0x0200) ? (value & 0x03FF) : value;

这里是明确写出的操作逻辑。显然你可以用一行代码来做到这一点,但我希望这能解释 为什么 .

#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main(int argc, char* argv[]) {   
    //int16_t  value = 0x3fdb; // random examples
    //int16_t  value = 0x00f3;
    int16_t  value = 0x3f3;
    printf("0x%04x (%i)\n", value, value); // in
    uint16_t mask  = 0x3ff; // 0000 0011 1111 1111 in binary
    uint16_t masked = value & mask; // get only the 10 LSB
    uint16_t extension = (0x200 & value) ? 0xFC00 : 0x0; // extend with 1s or 0s
    printf("extension: %i\n", (extension)?1:0);
    int16_t  extended = extension | masked; // do the extension
    printf("0x%04x (%i)\n", extended, extended); // out

    return 0;
}

示例:

0x00f3 (243)
extension: 0
0x00f3 (243)

0x3fdb (16347)
extension: 1
0xffffffdb (-37)

0xfffffff3 (-13)
extension: 1
0xfffffff3 (-13)

0x03f3 (1011)
extension: 1
0xfffffff3 (-13)