【正确答案】
【答案解析】判断一个变量是无符号数还是有符号数有以下3种方法:
1)采用取反操作。
对于这个变量分两种情况进行分析,一种情况是它为某种类型的值,另一种情况是它为某种类型。对于值而言,如果这个数以及其求反后的值都大于0,则该数为无符号数,反之则为有符号数,因为数据在计算机中都是以二进制的0或1存储的,正数以0开头,负数以1开头,求反操作符会把所有的1改为0,所有的0改为1。如果是有符号数,那么取反之后,开头的0会被改为1,开头的1会被改为0,开头为1时即表示该数为负数,如果是无符号数则不会受此影响。对于类型而言,也同样适用。
对于为值的情况,可以采用如下宏定义的方式:
#define ISUNSIGNED(a)(a>=0&&~a>=0)
对于为类型的情况,可以采用如下宏定义的方式:
#define ISUNSIGNED(type)((type)0-1>0)
前者一般只适用于K&R C,不适用于ANSI C的情况。
程序示例代码如下:
#include<stdio.h>
#define ISUNSIGNED(a) (a>=0)&&(~a>=0)
#define ISUNSIGNED_TYPE(type)((type)0-1>0)
int main()
{
int a=0;
unsigned int b=0;
printf("%d/n",ISUNSIGNED(a));
printf("%d/n",ISUNSIGNED(b));
printf("%d/n",ISUNSIGNED_TYPE(int));
printf("%d/n",ISUNSIGNED_TYPE(unsigned int));
return 0;
}
程序输出结果:
0
1
0
1
2)由于无符号数和有符号数相减的结果为无符号,所以还可以采用以下方法判断:
#include<stdio.h>
int main()
{
int a=100;
int b=-1;
if(a<0)
{
printf("有符号数");
}
else
{
if(b-a>0)
printf("无符号数/n");
else
printf("有符号数/n");
}
return 0;
}
程序输出为
有符号数
上例中,当把变量a的类型变为unsigned int时,程序的输出则变为
无符号数
3)通过改变符号位判断。把A进行一个位运算,将最高位置1,判断是否大于0。
程序示例如下:
#include<stdio.h>
int main()
{
unsigned A=10;
A=A|(1<<31);
if(A>0)
printf("无符号数/n");
else
printf("有符号数/n");
return 0;
}
程序输出为
无符号数