【发布时间】:2014-12-10 14:34:32
【问题描述】:
我有一个具有 2x int16 值的变量:
int32_t value = 0x1234ABCD; // a=0x00001234, b=0xFFFFABCD
天真的解决方案是做一个面具:
int32_t a = (value & 0xFFFF0000) >> 16;
int32_t b = (value & 0x0000FFFF);
但是有了这个,我没有任何符号扩展并且 b 变成 0x0000ABCD 而不是 0xFFFFABCD。
我的下一个尝试是使用中间结构
struct dual_int16 {
long hi:16;
long lo:16;
}
int32_t a = (struct dual_int16)value).lo;
int32_t a = (struct dual_int16)value).hi;
不幸的是,我的编译器不允许我这样做“不允许使用 struct dual_int16”或“类型转换必须是算术或指针”。
是否有任何正确的方法可以在 C99 中通过符号扩展提取我的 2x int16?
编辑
因为我使用的是特定的编译器 (ADSP-21xxx) 。我没有在stdint.h 中定义的所有标准类型,例如int16_t。我的编译器无法识别int8_t 和int16_t。
arch 有一个混合的 32-48 位双 ALU,大端。
【问题讨论】:
-
在转换为 32 位之前,您是否尝试过转换为
int16_t? -
您可能想尝试将 16 位值存储为 16 位类型。
-
是什么让你认为
0x1234ABCD & 0x0000FFFF应该变成0xFFFFABCD? -
您想要 int16 但将结果定义为 int32。结果正常。
-
@BennoZeeman 因为我存储了 2x int16。
0xABCD= -21555。如果您进行符号扩展,最终值将变为0xFFFFABCD= -21555
标签: c