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作为输出。我的逻辑的哪一部分不正确?
您所看到的行为可以通过C的转换规则来解释:
6.3.1.3有符号和无符号整数
1将整数类型的值转换为以外的其他整数类型时
_Bool
,如果该值可以用新类型表示,则该值不变。2否则,如果新类型是无符号的,则通过重复添加或减去比新类型可表示的最大值多一个值来转换该值,直到该值在新类型的范围内为止。
(此报价来自C99。)
-20000
不能用an表示,unsigned short
因为它是负数。目标类型是无符号的,因此通过重复添加65536(是USHORT_MAX + 1
),直到它在range:-20000 + 65536
is之内,来转换该值45536
。
请注意,此行为是C标准规定的,与内存中负数的实际表示方式无关(特别是,即使在使用符号/幅值或“ 1”的机器上,其工作方式也相同)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句