gpt4 book ai didi

c - Visual Studio 转换问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:44 24 4
gpt4 key购买 nike

我正在努力完成我想象中的一项相当基本的任务。我有两个 unsigned char 变量,我试图将它们组合成一个 signed int。这里的问题是 unsigned chars 以 signed chars 开始,所以我必须先将它们转换为 unsigned。

我已经在三个 IDE 中完成了这项任务; MPLAB(因为这是一个嵌入式应用程序)、MATLAB,现在正尝试在 visual studio 中进行。视觉是唯一一个在类型转换方面有问题的人。

例如,两个有符号字符是 -5 和 94。在 MPLAB 中,我首先将这两个字符转换为无符号字符:

unsigned char a = (unsigned char)-5;
unsigned char b = (unsigned char)94;

这分别给了我 251 和 94。然后我想做一些位移和连接:

int c = (int)((((unsigned int) a) << 8) | (unsigned int) b);

在 MPLAB 和 MATLAB 中,这为我提供了正确的 signed 值 -1186。但是,视觉中完全相同的代码拒绝将结果输出为有符号值,只有无符号值 (64350)。这已经通过调试和单步执行代码并打印结果进行了检查:

printf("%d\n", c);

我做错了什么?这让我发疯。该应用程序是一种电子设备,可收集传感器数据,然后将其存储在 SD 卡上,以便稍后使用 C 语言编写的程序进行解码。从技术上讲,我可以在 MPLAB 中进行所有计算,然后将这些计算存储在SDCARD,但我拒绝让微软赢。

我知道我的转换方法没有得到优化,你可能可以在一行中完成,但是这个问题已经持续了几天,现在我已经尝试尽可能地分解步骤。

非常感谢任何帮助!

最佳答案

问题是大多数系统上的 int 是 32 位的。如果您连接两个 8 位数量并将其存储为一个 32 位数量,您将得到一个正整数,因为您没有设置 sign 位,这是最高有效位。更具体地说,您只是填充 32 位整数的低 16 位,这自然会被解释为正数。

您可以通过显式使用 as 16 位有符号整数来解决此问题。

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

int main() {
unsigned char a = (unsigned char)-5;
unsigned char b = (unsigned char)94;
int16_t c = (int16_t)((((unsigned int) a) << 8) | (unsigned int) b);
printf("%d\n", c);
}

请注意,我使用的是 Linux 系统,因此您可能必须将 stdint.h 更改为 Microsoft 的等效文件,并可能将 int16_t 更改为 Microsoft 对其调用的任何名称16 位 有符号整数类型(如果不同),但这应该适用于这些修改。

关于c - Visual Studio 转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22920643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com