c - 24 位有符号数据类型

标签 c labwindows 24-bit

我正在从 ublox GPS 模块接收 24 位长位字段(4 字节消息中的 3 个字节)的数据,并且我需要将这些 24 位数据字段转换为带符号的十进制值,但我找不到说明规范中说明了如何执行此操作。我还知道该模块附带的另一个程序的某些值。

对于正值,它似乎只是简单地将 24 位二进制数转换为十进制,仅此而已,例如0x000C19 = 30970x000BD0 = 3024 ,但对于负数我就有麻烦了。 2的补码似乎不起作用。以下是一些已知值:0xFFFFC8 = -57 , 0xFCB9FE = -214528 , 0xFF2C3B = -542150xFFFA48 = -1462 。使用 2 的补码,每次转换都会偏离几个数字(分别为 -56、-214530、-54213、-1464)。 (使用十六进制数字是为了避免每次都要写入 24 位数字。)

提前感谢您的帮助!

最佳答案

首先,您拥有的“已知”值并不像您想象的那样:

#include <stdio.h>

static void p24(int x)
{
    printf("%8d = 0x%06X\n", x, (0x00ffffff & (unsigned)x));
}

int main(int argc, char *argv[])
{
    p24(-57);
    p24(-214528);
    p24(-54215);
    p24(-1462);
    return 0;
}

在2s补码机上编译并运行打印

     -57 = 0xFFFFC7
 -214528 = 0xFCBA00
  -54215 = 0xFF2C39
   -1462 = 0xFFFA4A

当转换为 2 补码时,您当然必须填充到您正在使用的目标数据类型的完整长度,以便正确地保留符号。然后将有符号数据类型划分为设计的位数。

例如:

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

/* 24 bits big endian */
static char const m57[]     = {0xFF, 0xFF, 0xC7};
static char const m214528[] = {0xFC, 0xBA, 0x00};
static char const m54215[]  = {0xFF, 0x2C, 0x39};
static char const m1462[]   = {0xFF, 0xFA, 0x4A};

static
int32_t i_from_24b(char const *b)
{
    return (int32_t)(
        (((uint32_t)b[0] << 24) & 0xFF000000)
      | (((uint32_t)b[1] << 16) & 0x00FF0000)
      | (((uint32_t)b[2] <<  8) & 0x0000FF00)
    ) / 256;
}

int main(int argc, char *argv[])
{
    printf("%d\n", i_from_24b(m57) );
    printf("%d\n", i_from_24b(m214528) );
    printf("%d\n", i_from_24b(m54215) );
    printf("%d\n", i_from_24b(m1462) );
    return 0;
}

将打印

-57
-214528
-54215
-1462

关于c - 24 位有符号数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38224801/

相关文章:

c - C 中的段错误 11 在排序列表中插入节点

c - 是什么导致 Labwindows/CVI C 程序讨厌数字 2573?

audio - 使用 24 位音频样本

c++ - C/C++ - 将 24 位有符号整数转换为 float

c - 如何将C游戏移植到浏览器

c# - 我将创建一个程序用条形码检查库存,我需要学习什么

c - 16 位数字的 2 补码

c - LabWindows 中的实时数据过滤?

c - 使用 NI VISION imaqDetectLines() 函数时出现一般保护错误

java - Java播放的24位音频不正确