关于C的数据转换问题

来源:百度知道 编辑:UC知道 时间:2024/04/30 03:53:31
main()
{ unsigned int a=65535;
int b=-2;
printf("a=%d,%o,%x,%u\n",a,a,a,a);
printf("b=%d,%o,%x,%u\n",b,b,b,b);
}
输出
a=-1,177777,ffff,65535
b=-2,177776,fffe,65534

a=%d和b=%u
这2个输出结果的2进制是怎么样转换的

运用补码的知识。

负数的补码是它对应的正数的原码取反再加1

举例:3的原码是00000011,取反后是11111100,再加1是11111101
这就是-3的补码.

16位二进制数能够表示2的16次方即65536个数.

有符号16位二进制补码所能表示的数值范围是-32768到32767.

无符号16位二进制补码所能表示的数值范围是0到65535.

您的情况:无符号数 a = 65535
a 的二进制表示是1111 1111 1111 1111
如果将a 看作是有符号数,那个a 就是有符号数的-1, 推导如下:

无符号数1 的二进制表示为0000 0000 0000 0001
于是运用补码的知识(见文首)我们可以知道-1的补码是1111 1111 1111 1111
这与a 的二进制表示完全相同,即a 被看成有符号数的话,它所表示的值是-1

下面说b 的情况:

b = -2, 而2的二进制表示为0000 0000 0000 0010
于是-2的补码为1111 1111 1111 1110
将其看作无符号数时, 数值为65534

至于8进制和16进制的值,只要做相应数制转换即可,
例如1111 1111 1111 1111
化为十六进制是FFFF
也可以以三位为单位看
001 111 111 111 111 111
此即8进制的 177777

下面对补码进行说明(16位情况下):

补码是循环的,最大的数32767,加1就等于最小的数-32768,
0111 1111 1111 1111 ( 32767) 加1以后等于
1000 0000 0000 0000 (-32768)
无符号的(32768)1000 0000 0000 0000取反再加1所得到的-32768的补码
仍然是1000