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 作为输出。我逻辑的哪一部分不正确?
答案 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}的计算机上,它的工作方式也相同})。