C++将无符号数转换为有符号数

6

我试图复制这个,但它无法编译。

unsigned char x = 0;
reinterpret_cast<signed char>(x);

它说

C:\Users\SXG5558\Documents\Arduino\sketch_jun30a\sketch_jun30a.ino: In function 'void setup()':

sketch_jun30a:3: error: invalid cast from type 'unsigned char' to type 'signed char'

     reinterpret_cast<signed char>(x);

                                    ^

exit status 1

编辑:

为了明确,我真的想把内存中的位从有符号转换为无符号。我正在编写一个I2C库,用于读写无符号数据,但我使用该库来控制有符号传感器,因此我想重新解释实际数据的类型。


7
你提供的示例代码中有 reinterpret_cast<unsigned char&>(x);。注意 & 符号。 - 463035818_is_not_a_number
1
你的问题标题不正是要求与你代码中所示的相反的转换方向吗? - πάντα ῥεῖ
只需使用核弹式的(signed char)x转换即可。 - pm100
@πάνταῥεῖ,我编辑了标题以反映这一点。 - charmoniumQ
@pm100 C风格的转换将会是一个静态转换,但我想要一个重新解释的转换。 - charmoniumQ
会完全按照你的要求去做。 - pm100
1个回答

5
cppreference.com中提取的相关部分如下:

类型别名

当将指向动态类型为DynamicType的对象的指针或引用重新解释为不同类型AliasedType的对象的指针或引用时(或使用C风格的转换),转换总是成功的,但结果指针或引用只能用于访问对象,如果满足以下条件之一:

[...]

  • AliasedType是DynamicType的(可能带cv限定符的)有符号或无符号变体

[...]

即。您从链接的示例中忘记了&

1
我简直不敢相信我错过了那个问题。感谢你回答了一个愚蠢的问题。 - charmoniumQ
@Sam 实际上这并不是一个愚蠢的问题。我花了一些时间才明白为什么没有使用&就无法正常工作,而且我仍然无法解释它的原因... - 463035818_is_not_a_number
我认为这样做是为了确保赋值正确(例如 reinterpret_cast<uint8_t&>(x) = 10)。这就引出了一个问题,如果你不想要这个功能怎么办?如何将 reinterpret_cast<uint8_t&>(f()) 转换而不将 f() 的结果分配给临时变量。 - charmoniumQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接