c++ - 将无符号解释为有符号

标签 c++ embedded reinterpret-cast static-cast

我在嵌入式平台 (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/

相关文章:

linux - 如何判断linux设备的事件?

arm - STM32编程技巧和问题

c++ - reinterpret_cast<> 在 sse/avx 类型上是安全的还是未定义的?

c++ - 将整数转换为指针总是定义良好吗?

c++ - std::unordered_map 之间的reinterpret_cast

c++ - Visual Studio C++ 预处理器定义失败,路径从 "u"开始

c++ - 无法在 C++ 中创建包含日期和时间的文件名

c++ - boost::serialization - 序列化从通用属性/功能容器派生的类

c++ - 在 QString 中连接 STL string+int+int+int

c - 软件如何识别中断发生?