我想知道类型转换在类型之间的实践中是如何工作的(在“嵌入式”C中)。例如:如果我的Signed 16-bit
数字的值为-80d
,11010000b
,我想将其转换为unsigned 16-bit
。我得到了哪个值,它只是80d,还是208.
我的意思是,转换是按位还是算术?只是对位的解释改变了,还是转换确实改变了位?
如果它确实改变了比特,我将如何以这样的方式只做解释改变。这将是例如当我从i2c设备读取u8值并且必须将比特解释为签名值。
最后,实际上与上面相同:如果它不改变位,我将如何转换它以改变位而不是值?
亲切的问候, 杰西
答案 0 :(得分:4)
无论何时进行强制转换,都会触发类型转换,该转换由C11 6.3.1.3指定:
6.3.1.3有符号和无符号整数
当整数类型的值转换为_Bool以外的另一个整数类型时,if 该值可以用新类型表示,不变。
否则,如果新类型是无符号的,则通过重复添加或转换该值 减去一个可以在新类型中表示的最大值 直到该值在新类型的范围内.60)
否则,新类型已签名且值无法在其中表示;无论是 结果是实现定义的或引发实现定义的信号。
第二段涵盖从签名转为无签名的程序。它以这种奇怪的方式编写,涵盖了各种签名格式。实际上在16位二进制补码系统中的含义是-80d
(十六进制FFB0h
)最终得到的值为FFB0h
,这是无符号数{{1} }。
它不会改变任何位。