让我们假设一个16位变量(a)存储为无符号16位。如果我使用带符号的16位数字,可以说我将带符号的数字(b)读为二进制补码格式吗?
uint16_t a = 0xFFF1;
int16_t b;
b = (int16_t)a;
Run Code Online (Sandbox Code Playgroud)
几乎是。所有常见的体系结构都应为二进制补码,并且将等宽度的无符号到符号转换基本上视为无操作。
理论上并不总是如此。C标准表示,_Bool
如果值适合(6.3.1.3p1),则向非类型的转换不会更改值;否则,对于无符号到符号的转换,您将获得实现定义的转换或引发信号(6.3.1.3 p3)。
1将整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则该值不变。
2否则,如果新类型是无符号的,则通过重复加或减比新类型可表示的最大值多一个值来转换该值,直到该值在新类型的范围内。60)
3否则,将对新类型进行签名,并且无法在其中表示值;结果是实现定义的,还是引发实现定义的信号。
(通过将_Bool转换为0(6.3.1.2p1),如果源适合(0或1),也没有任何变化,但是所有非零数字都转换为(_Bool)1
,而如果应用了环绕规则(6.3.1.3p2) ,那么偶数也将转换为(_Bool)0
,但不会。)
正如Jens Gustedt在评论中指出的那样,C2x应该删除特殊情况,因此实际上是应该始终是。