方法一:
判断一个数是不是有符号数:首先判断这个数是不是小于零,小于零肯定是有符号数
然后根据无符号数和有符号数相减结果为无符号数
#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。