c - Visual Studio 转换问题

标签 c visual-studio-2010 casting unsigned signed

我正在努力完成我想象中的一项相当基本的任务。我有两个 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/

相关文章:

c - pthreads中pthread_t的数据类型?

c# - VB.NET 窗体中的 AppSettings 如何工作?

c++ - 为什么我需要转换算法 remove() 的参数?

c++ - 从文件中读取的 ARRAY 类 BubbleSort

c - pthreads:等到 read() 返回值 > 0

C程序限制整数输入范围

visual-studio - 如何从 Visual Studio 2010 运行 PowerShell 脚本

visual-studio-2010 - 比较 SQL Server 数据库架构

ruby-on-rails - ActiveRecord::Base.store 自动类型转换

unicode - 在 Free Pascal 3 中什么时候可以安全地将 UnicodeString 转换为字符串?