C将短Int转换为无符号短

时间:2017-04-30 18:23:12

标签: 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;
}

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

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

1 个答案:

答案 0 :(得分:6)

您看到的行为可以通过C:

的转换规则来解释
  

6.3.1.3有符号和无符号整数

     

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

     

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

(此报价来自C99。)

-20000无法由unsigned short表示,因为它是否定的。目标类型是无符号的,因此通过重复添加65536(USHORT_MAX + 1)来转换该值,直到它在范围内:-20000 + 65536正好是45536

请注意,此行为是C标准强制执行的,与内存中实际表示负数的方式无关(特别是,即使在使用sign/magnitude或{{3}的计算机上,它的工作方式也相同})。