让我们假设将一个16位变量(a)存储为无符号16位。如果我使用带符号的16位数字,可以说我将带符号的数字(b)读为二进制补码格式吗?
commit_a
答案 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应该删除特殊情况,因此实际上是应该变成总是。