假设我们定义:
short x = -1;
unsigned short y = (unsigned short) x;
Run Code Online (Sandbox Code Playgroud)
根据C99标准:
否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.(ISO/IEC 9899:1999 6.3.1.3/2)
因此,假设两个字节为short和一个二进制补码表示,这两个整数的位模式为:
x = 1111 1111 1111 1111 (value of -1),
y = 1111 1111 1111 1111 (value of 65535).
Run Code Online (Sandbox Code Playgroud)
由于-1不在无符号短整数的值范围内,并且可以用无符号短整数表示的最大值是65535,因此将65536添加到-1以得到65535,其在无符号短整数范围内.因此,在从int转换为unsigned时,位保持不变,尽管所表示的值已更改.
但是,该标准还表示,表示可能是两个补码,一个补码,或符号和幅度."其中哪些适用于实现定义,......"(ISO/IEC 9899:1999 6.2.6.2/2)
在使用一个补码的系统上,x将表示为1111 1111 1111 1110在投射之前,并且在使用符号和幅度表示的系统上,x将表示为1000 0000 0000 0001.这两个位模式都表示值-1,它不在无符号短值的值范围内,因此在每种情况下将65536添加到-1以使值进入范围.在演员之后,这两个位模式都将是1111 1111 1111 1111.
因此,在从int到unsigned int的 …