C中的二进制补码

lov*_*ell 2 c math

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

uint16_t a = 0xFFF1;
int16_t b;
b = (int16_t)a;
Run Code Online (Sandbox Code Playgroud)

PSk*_*cik 6

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

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

6.3.1.3有符号和无符号整数

1将整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则该值不变。

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

3否则,将对新类型进行签名,并且无法在其中表示值;结果是实现定义的,还是引发实现定义的信号。

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

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

  • 除非出现意外,C2x 将删除其他符号表示。 (2认同)