如何判断一个数为无符号数还是有符号数

方法一:

判断一个数是不是有符号数:首先判断这个数是不是小于零,小于零肯定是有符号数

然后根据无符号数和有符号数相减结果为无符号数

#include <iostream>
using namespace std;
int main()
{
	unsigned int a = 100;  //待判断数
	//int a = 100;
	int b = -1; //参照数
	if(a<0)
	{
		cout<<"有符号数0"<<endl;
	}
	else
	{
		if(b-a>0)//若 a 为无符号数,则 b - a 时,b 会“升级”为无符号数,-1 变成无符号数就是 0xFFFFFFFF,是最大值,因此 b - a 将为非负数
			cout<<"无符号数"<<endl;
		else
			cout<<"有符号数1"<<endl;
	}
	system("pause");
	return 0;
}


方法二:

利用函数重载

#include <iostream>
using namespace std;
void f(int val)
{
	std::cout <<val<< " is signed" << std::endl;
}

void f(unsigned int val)
{
	std::cout <<val<< " is unsigned" << std::endl;
}
int main()
{
	unsigned int a = 100;  //待判断数
	//int a = 100;
	int b = -1; //参照数
	f(a);
	f(b);
	system("pause");
	return 0;
}


方法三:

首先将0赋给要判断的变量(a)

然后判断 变量(a)是否小于变量(a)-1,如果条件为真,则变量(a)为无符号数,否则变量(a)为有符号数。

代码:

 unsigned int a = 0;
 if(a < a-1) {
      printf("/nunsiged");
 }else{
      printf("/nsigned");
 }

分析:如果变量(a)为无符号数,小于号左边为无符号数,右边为-1是有符号数,两边类型不一致,编译器会稳式地把有符号数转换成无符号数,则右边为无符号数的最大数,if的条件会为真。如果变量(a)为有符号数,小于号两边类型一致,不需要转换,条件自然就为假。


方法四:

通过改变符号位判断

把A进行一个位运算,将最高位置1,判断是否大于0
A = A|(1 << 31);
if(A > 0)
printf("unsigned");
else
printf("signed");

方法五:

 利用去反等判断

看到过这样的方法:
n为非负数
n>=0 && -n>=0 && n-1>=0
为真则为无符号,否则有符号




ANSI C手册中的关于寻常算术转换的规定。

首先,如果一个操作书的类型是long double,那么另一个操作数也被转化为long double。其次,如果一个操作数的类型是double,那么另一个操作数也被转换为double。再次,如果其中一个操作数的类型是float,那么另一个操作数也被转换为float。否则,两个操作数进行整型提升,执行下面的规则:

如果其中一个操作数是unsigned long int,那么另一个操作数也被转换为unsigned long int。其次,如果其中一个操作数是long int, 而另一个操作数的类型是unsigned int ,如果long int 能够完整表示unsigned int 的所有值,那么unsigned int类型操作数被转换为long int,如果long int类型不能完整的表示unsigned int 的所有值,那么两个操作数都被转换为unsigned long int。再次,如果其中一个操作数的类型是long int,那么另一个操作数转换为long int。再再次,如果其中一个操作数的类型是unsigned int ,那么另一个操作数被转换为unsigned int。如果所有以上的情况都不属于,那么两个操作数都为int。

简言之,当进行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点精度更高,长度更长的防线转换,整型数如果转换为signed 不会丢失信息,就转换为signed,否则转换为unsigned。





版权声明:本文为yang6464158原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。