C语言,位运算问题

来源:百度知道 编辑:UC知道 时间:2024/05/22 06:31:55
以下程序设计好像不正确,请高手指点错误原因?

/*使给出一个数的源码,能得到该数得补码 */
#include <stdio.h>
main()
{
int bu_ma(int x);
int n;

scanf("%o",&n);
printf("%o",bu_ma(n));
}

bu_ma(int x)
{ unsigned short a;
if(x>=0)/*正数的补码 */
return(x);
else/*负数的补码 */
x=x*-1;/*求绝对值 */
a=~x+1;/*取反、加1*/
return(a);
}
这段程序中的temp1=(unsigned short)(~0)^((unsigned short)(~0)>>1);的意思能具体解释一下么

#include "stdafx.h"
#include <stdio.h>
main()
{
unsigned short bu_ma(unsigned short x);
unsigned short n;

scanf("%x",&n);
printf("%x(%d)",bu_ma(n),(short)bu_ma(n));
}

unsigned short bu_ma(unsigned short x)
{ unsigned short a,temp1=(unsigned short)(~0)^((unsigned short)(~0)>>1),temp2=(unsigned short)(~0)>>1;

if(x&temp1)/*如果最高位是1*/
/*负数的补码 */
{
a=x&temp2;/*求绝对值 */
a=~a+1;/*取反、加1*/
return(a);
}
else/*正数的补码 */
return(x);
}
改过了,输入是十六进制,输出同样是十六进制(括号中给出十进制带符号表示)

我的修改次数达到最大了,你又不肯显示你的身份.只能借用别人的号来回答:
这段代码中temp1=(unsigned short)(~0)^((unsigned short)(~0)>>1)是构造最高位为1,其余位全0的一个短整型无符号数.它与其他数与的结果是取出该数的最高位.
temp2=(unsigned short)(~0)>>1是构造的一个最高位为0,其余位全1的短整型无符号数.它与其他数与的结果是丢掉该数的符号位.

没错吧,我运行了一次。但是我没计算,看起来好象没错啊。