我在嵌入式平台 (ARM) 上工作,在处理位模式时必须小心。让我们假设这条线不受我的影响:
uint8_t foo = 0xCE; // 0b11001110
解释为无符号时,这将是 206。但实际上它是有符号的,因此类似于 -50。我怎样才能继续使用这个已签名的值?
int8_t bar = foo; // doesn't work
两者都不做(所有输入值都为 0x10 或 0x00)
int8_t bar = static_cast<int8_t>(foo);
int8_t bar = reinterpret_cast<int8_t&>(foo);
我只想让这些位保持不变,即。 (bar == 0xCE)
反之亦然 我对如何在不弄乱位模式的情况下将表示负数的位模式转换为无符号变量感兴趣。我正在使用 GCC。
最佳答案
以下对我来说很好,它应该虽然正如评论所说,这是实现定义的:
int x = (signed char)(foo);
在C++中,你也可以说:
int x = static_cast<signed char>(foo);
请注意,提升总是在重新解释位模式之前尝试保留值。因此,您首先必须强制转换为与无符号类型大小相同的带符号类型,以强制进行带符号的重新解释。
(当尝试将 char
打印为成对的十六进制数字时,我通常会遇到相反的问题。)
关于c++ - 将无符号解释为有符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7373852/