首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >24位有符号数据类型

24位有符号数据类型
EN

Stack Overflow用户
提问于 2016-07-06 21:06:02
回答 3查看 2.1K关注 0票数 1

我正在从ublox GPS模块接收24位长的位域(4字节消息中的3个字节)的数据,我需要将这些24位数据域转换为带符号的十进制值,但我在规范中找不到如何做到这一点的描述。此外,我还知道模块附带的另一个程序的某些值。

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

提前感谢您的帮助!

EN

回答 3

Stack Overflow用户

发布于 2016-07-06 21:18:02

首先,你所拥有的“已知”值并不是你想的那样:

代码语言:javascript
运行
复制
#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补码机器打印上编译和运行

代码语言:javascript
运行
复制
     -57 = 0xFFFFC7
 -214528 = 0xFCBA00
  -54215 = 0xFF2C39
   -1462 = 0xFFFA4A

当转换为2补码时,你当然必须填充到你正在处理的目标数据类型的全长,这样符号才能被正确地传递。然后将带符号的数据类型划分为设计的位数。

例如:

代码语言:javascript
运行
复制
#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;
}

将打印

代码语言:javascript
运行
复制
-57
-214528
-54215
-1462
票数 1
EN

Stack Overflow用户

发布于 2016-07-06 22:11:30

OP的信息不一致,可能适用于@John Bollinger注释:“...执行转换的程序正在失去精度...”

OP需要审查和发布更多信息/代码。

代码语言:javascript
运行
复制
OP's        OP's    2's comp.   Diff
Hex         Dec     
0xFFFFC8    -57     -56        -1
0xFCB9FE    -214528 -214530     2
0xFF2C3B    -54215  -54213     -2
0xFFFA48    -1462   -1464       2

由于此评论的复杂性,请将其作为答案发布

票数 0
EN

Stack Overflow用户

发布于 2016-07-07 16:38:42

感谢大家的帮助,但我刚刚意识到我是弱智,甚至更弱智!我从程序中获得的“已知值”显示了测量数据的缩放值,在转换后,+-1 +-2偏差似乎在相同的0.001精度显示值的范围内,因此它确实使用了2s补码。

很抱歉浪费了大家的时间!(太棒了,太棒了)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38224801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档