无符号数化为带符号数要将将除符号位外所有数取反,再+1,例如-2(u)为二进制为1000 0010,化为无符号数为:1111 1110
2化为无符号数为:0111 1110
-2化为无符号数为:1111 1110
所以-2u>2u
#include<iostream>
using namespace std;
int main()
{
if(-2u<2u) cout<<"-2u<2u is true"<<endl;
else cout<<"-2u<2u is false"<<endl;
return 0;
}
代码运行结果为:-2u<2u is false
无符号数和带符号数的比较
#include<iostream>
using namespace std;
int main()
{
if(-2<2u) cout<<"-2u<2u is true"<<endl;
else cout<<"-2u<2u is false"<<endl;
return 0;
}
运行结果为:-2<2u is false
无符号数和带符号数做比较时,编译器会将带符号数转换为无符号数,-2化为32为十六进制无符号数为ffff fffeH,2化为十六进制无符号数为2H,显然,2u>-2
一、无符号数转带符号数
无符号数为正数时,转换为带符号数需要在其基础上减去
例如:unsigned x=2147483649,将x转换为32位带符号数即为:2147483649-=-2147483647
unsigned x=2147483649;
printf("x=%d",x);
x=-2147483647
无符号数为负数时,转换为带符号数需要在其基础上加上
例如:unsigned x=-2147483649,将x转换为32为带符号数即为:-2147483649+=2147483647
unsigned x=-2147483649;
printf("x=%d",x);
x=2147483647
二、带符号数转换为无符号数
为正数时,转换为无符号数时保持不变
为负数时,转换位无符号数时在其基础上加上
例如:int x=-3147483649,转换为32位无符号数即为:-3147483649+=1147483647
int x=3651254935;
int y=-3147483649;
printf("x=%u\n",x);
printf("y=%u\n",y);
x=3651254935
y=1147483647