【发布时间】:2021-11-09 14:52:29
【问题描述】:
我有一个带符号的 8 位整数 (int8_t) -- 它可以是从 -5 到 5 的任何值 -- 并且需要将其转换为无符号的 8 位整数 (uint8_t) .
这个uint8_t 值随后会被传递到另一块硬件(只能处理 32 位类型)并且需要转换为 int32_t。
我该怎么做?
示例代码:
#include <stdio.h>
#include <stdint.h>
void main() {
int8_t input;
uint8_t package;
int32_t output;
input = -5;
package = (uint8_t)input;
output = (int32_t)package;
printf("output = %d",output);
}
在本例中,我以-5 开头。它暂时被转换为251,因此可以打包为uint8_t。然后,此数据被发送到另一块硬件,在该硬件中我无法使用 (int8_t) 将 8 位无符号整数转换回有符号,然后再转换为 int32_t。最终,我希望能够获得原始的-5 值。
有关详细信息,接收硬件是 SHARC 处理器,它不允许 int8_t - 请参阅 https://ez.analog.com/dsp/sharc-processors/f/q-a/118470/error-using-stdint-h-types
SHARC 处理器上最小的可寻址内存单元是 32 位,这意味着任何数据类型的最小大小都是 32 位。这适用于原生 C 类型,如 char 和 short。因为类型“int8_t”、“uint16_t”指定类型的大小必须分别为8位和16位,所以SHARC不支持。
【问题讨论】:
-
这真的取决于你所说的“转换”是什么意思。当您将
int8_t转换为uint8_t时,您期望-5变成什么?在您当前的代码中,它变为251。 -
这里真正的问题是,为什么要先通过
uint8_t?因为要保留一个无符号的 8 位值,然后将其扩展到 32 位? -
感谢您的评论 - 这与硬件限制有关。我正在将数据从一个硬件发送到另一个。所有数据都需要以无符号整数 8 位包的形式发送。但是我收到的硬件不允许我在转换为 int32_t 之前转换为 (int8_t)
-
你必须通过几个例子来阐明你希望你的最终结果是什么,我们不能只是猜测你想要做什么。当
-5最终转换为int32_t时,您是否希望-5保持不变? -
看来你的要求很混乱。硬件通常不需要带符号的数字。您要解决的实际问题是什么?您是否正在尝试发明一种数据通信协议?然后需要为该协议指定签名和字节序等,并且每个使用它的 CPU 都必须转换到该协议/从该协议转换。