C将短Int转换为无符号短

Rye*_*Guy 4 c unsigned-integer

C中的short int包含16位,第一位表示该值是负还是正.我有一个C程序如下:

int main() {
    short int v;
    unsigned short int uv;
    v = -20000;
    uv = v;
    printf("\nuv = %hu\n", uv);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于v的值是负的,我知道变量的第一位是1.所以我希望程序的输出等于uv = 52,768 b/c 20,000 +(2 ^ 15)= 52,768.

相反,我得到uv = 45536作为输出.我逻辑的哪一部分不正确?

mel*_*ene 7

您看到的行为可以通过C的转换规则来解释:

6.3.1.3有符号和无符号整数

1当具有整数类型的值转换为除了以外的另一个整数类型时_Bool,如果该值可以由新类型表示,则它将保持不变.

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

(此报价来自C99.)

-20000不能用a表示,unsigned short因为它是否定的.目标类型是无符号的,因此通过重复添加65536(即USHORT_MAX + 1)来转换该值,直到它在范围内:-20000 + 65536完全正确45536.

请注意,此行为是由C标准强制执行的,与负数在内存中的实际表示方式无关(特别是,即使在使用符号/幅度补码的机器上,它的工作方式也相同).