【问题标题】:C type casting: bitwise or arithmeticC 类型转换:按位或算术
【发布时间】:2017-11-10 14:44:12
【问题描述】:

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

我的意思是,转换是按位还是算术?只是对位的解释发生了变化,还是转换真的改变了位?

如果它确实改变了位,我将如何以这种方式做到这一点只是解释发生变化。例如,当我从 i2c 设备读取 u8 值并且必须将位解释为一个有符号的值。

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

亲切的问候, 杰西

【问题讨论】:

  • 这是在C标准here中精确定义的
  • -80 不是11010000,而是11111111 11010000。有16位,编号为sign extended

标签: c


【解决方案1】:

每当您进行强制转换时,都会触发类型转换,这是由 C11 6.3.1.3 指定的:

6.3.1.3 有符号和无符号整数

当整数类型的值被转换为_Bool以外的其他整数类型时,如果 该值可以用新类型表示,它是不变的。

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

否则,新类型是有符号的,值不能在其中表示;无论是 结果是实现定义的或引发了实现定义的信号。

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

它不会改变任何位。

【讨论】:

  • 同样,它不会改变 2 的补码系统 上的任何位,并不是说其他​​位会真正相关。
  • 即结果将始终为0xFFB0,无论是 2 或 1 还是符号+幅度系统,但位会自然地在 1 或符号+幅度系统中发生变化。
  • @AnttiHaapala 实际上对于所有签名格式都相同,因为新类型是无符号的,之后签名不适用。 -80 + 65536 给出 65456 无论签名格式。这些位不会改变,因为无符号 16 在所有允许的系统上具有相同的表示。
  • 是的,我的意思是在 2 的补码中,签名的演示文稿也设置了相同的位
  • 由于 OP 显然有一个 2 的补码系统,所以整个讨论不是很相关。此外,将话题转移到关于稀有和奇异符号格式的讨论中不会对任何初学者(如果有的话)有所帮助,只会让他们更加困惑。
猜你喜欢
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2012-02-14
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多