简单C语言补码问题

来源:百度知道 编辑:UC知道 时间:2024/06/06 02:49:31
int a=-1;
printf(〃%x,%o,%d〃,a,a,a);
输出结果为:
ffff,177777,-1
16.8进制的是怎么算的

int 型数据在内存中通常占2个字节,-1 用二进制表示为:
11111111 11111111,
转换成16进制,要把二进制数从低位起,每4位分成一组,再换算为相应的16进制数,即 1111 1111 1111 1111 ==> ff ff

转成 8进制,则把二进制数从低位起,每3位分成一组,再换算为相应的 8进制数,即 1 111 111 111 111 111 ==> 177777

-1的补码为ffff,转化成8进制177777
而且不同编译器结果不同
用vc++6.0的结果是
ffffffff,37777777777,-1

补码的表示方法,实际上就是让数值连续变化,以使得二进制下,带负数的加减法仍然成立。
所以,-1的补码,就等于0的补码再去掉1(最高位溢出不管)
如果在机器内,你的a是两个字节的变量,那么,十六进制下,
0的补码0x0000,去掉1,从不存在的“最高位”上借1,得
0xffff
八进制类似的,只不过由于两个字节的限制,借1后只剩下0177777了