【发布时间】:2014-05-20 04:21:27
【问题描述】:
我正在尝试完成我想象中的一项相当基本的任务。我有两个 unsigned char 变量,我试图将它们组合成一个带符号的 int。这里的问题是无符号字符以有符号字符开头,所以我必须先将它们转换为无符号字符。
我已经在三个 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,但我拒绝让微软赢。
我知道我的投射方法非常未优化,您可能可以在一行中完成,但这个问题已经有几天了,我已经尝试尽可能地分解步骤。
非常感谢任何帮助!
【问题讨论】:
-
我刚刚在
gcc中测试了它,它产生了64350,所以这几乎不是微软的问题。我相信这是 C 编程语言的正确行为。 -
如果您将两个 8 位值放入 32 位类型的低 16 位,为什么符号(高 16 位)很重要?如果您屏蔽并将 8 位值移出,您将获得正确的结果。
-
@Dan,我认为他希望将他的变量直接解释为带符号的
16-bit整数,而不是只想打包两个8-bit数量,然后再将它们提取出来。
标签: c visual-studio-2010 casting unsigned signed