C语言的一些运算

来源:百度知道 编辑:UC知道 时间:2024/05/03 19:44:23
用八进制和十六进制数(补码)表示:-617,-111,-28654
要过程,最好有说明,谢谢了
结果是这样的:(176627)(fd97)
(177621)(ff91)
(110022)(9012)
是怎么来的

负数的补码是除符号位外,按位取反再加1,所以我们的程序要按这个思想来!输出的补码是2个字节宽度的自动进行了符号位扩充的,如果希望没有进行符号位扩充的话,哪么只有判断数据有多少个比特位了编写起来就相对要麻烦些了!
main()
{
int a=-617,b=-111,c=-28654;
a=(~a)+0x0001;
a=-1*a;
b=(~b)+0x0001;
b=-1*b;
c=(~c)+0x0001;
c=-1*c;
printf("888888 %o %o %o\n",a,b,c);/*%o表示八进制数输出*/
printf("666666 %x %x %x\n",a,b,c);/*%x表示十六进制数输出*/
}

如果不考虑补码的话,计算机用int存储-2时是这样存储的!1111111111111110,按位取反后得到0000000000000001,加1后得0000000000000010再把符号位还原我用的方法是乘以-1,得到1111111111111110,不看不知道原来-2的补码也是他本身哦,^_^,但是你可以用这种方法来推其他的负数!

main()
{
int a=-617,b=-111,c=-28654;
printf("八进制数:%o %o %o\n",a,b,c);/*%o表示八进制数输出*/
printf("十六进制数:%x %x %x\n",a,b,c);/*%x表示十六进制数输出*/
}