C中的二进制补码

时间:2019-07-08 12:15:52

标签: c math

让我们假设将一个16位变量(a)存储为无符号16位。如果我使用带符号的16位数字,可以说我将带符号的数字(b)读为二进制补码格式吗?

commit_a

1 个答案:

答案 0 :(得分:6)

实际上是。所有常见的体系结构都应该是二进制补码,并且将等宽度的无符号到符号转换基​​本上视为无操作。

理论上并非总是。 C标准规定,如果值适合(6.3.1.3p1,则转换为非_Bool类型的值不会更改值,否则对于无符号到有符号的转换,您将获得实现定义的转换或信号(6.3.1.3p3)。

6.3.1.3 Signed and unsigned integers

  

1将整数类型的值转换为另一种整数类型时   除了_Bool以外,如果该值可以由新类型表示,则它   不变。

     

2否则,如果新类型是无符号的,则将值转换为   重复加或减一个比最大值大   可以用新类型表示,直到该值在   新类型。60)

     

3否则,将对新类型进行签名,并且值不能为   代表其中;结果要么是实现定义的,要么是   实施定义的信号被引发。

(通过与0(6.3.1.2p1进行比较,转换为_Bool。如果源适合(0或1),也没有任何变化,但是所有非零数字都转换为(_Bool)1,而如果套用环绕规则(6.3.1.3p2),那么偶数也将转换为(_Bool)0,但不会。)

正如Jens Gustedt在评论中指出的那样,C2x应该删除特殊情况,因此实际上是应该变成总是