C类型转换:按位或算术

时间:2017-11-10 14:44:13

标签: c

我想知道类型转换在类型之间的实践中是如何工作的(在“嵌入式​​”C中)。例如:如果我的Signed 16-bit数字的值为-80d11010000b,我想将其转换为unsigned 16-bit。我得到了哪个值,它只是80d,还是208.

我的意思是,转换是按位还是算术?只是对位的解释改变了,还是转换确实改变了位?

如果它确实改变了比特,我将如何以这样的方式只做解释改变。这将是例如当我从i2c设备读取u8值并且必须将比特解释为签名值。

最后,实际上与上面相同:如果它不改变位,我将如何转换它以改变位而不是值?

亲切的问候, 杰西

1 个答案:

答案 0 :(得分:4)

无论何时进行强制转换,都会触发类型转换,该转换由C11 6.3.1.3指定:

  

6.3.1.3有符号和无符号整数

     

当整数类型的值转换为_Bool以外的另一个整数类型时,if   该值可以用新类型表示,不变。

     

否则,如果新类型是无符号的,则通过重复添加或转换该值   减去一个可以在新类型中表示的最大值   直到该值在新类型的范围内.60)

     

否则,新类型已签名且值无法在其中表示;无论是   结果是实现定义的或引发实现定义的信号。

第二段涵盖从签名转为无签名的程序。它以这种奇怪的方式编写,涵盖了各种签名格式。实际上在16位二进制补码系统中的含义是-80d(十六进制FFB0h)最终得到的值为FFB0h,这是无符号数{{1} }。

它不会改变任何位。