69,381
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int iData = -1;
unsigned int uiData = -1;
if (iData == uiData)
{
printf("==\n");
}
else
{
printf("Not run here\n");
}
long lData = -1;
unsigned long ulData = -1;
if (lData == ulData)
{
printf("==\n");
}
else
{
printf("Not run here\n");
}
long long llData = -1;
unsigned long long ullData = -1;
if (llData == ullData)
{
printf("==\n");
}
else
{
printf("Not run here\n");
}
///////////////////////////////////////////////////////////////////////////////////////////////
// 小于一个字长时
short sData = -1;
unsigned short usData = -1;
if (sData > usData)
{
printf("sData > usData\n");
}
else if (sData < usData)
{
printf("sData < usData\n");
}
else
{
printf("sData = usData\n");
}
char cData = -1;
unsigned char ucData = -1;
if (cData > ucData)
{
printf("cData > ucData\n");
}
else if (cData < ucData)
{
printf("cData < ucData\n");
}
else
{
printf("cData = ucData\n");
}
return 0;
}
对于后两个:short类型为16位,那么对于sData,它在比较前存入寄存器后的数据为0xffff_ffff。前面的4个f表示补码的符号位;而usData却是0x0000_ffff。这是因为它是无符号的短整型,所以表示成最大16位数。那么这样,两者通过带符号的比较可以得出,0xffff_ffff < 0x0000_ffff。那么后面的char一样,对于8位数据,带符号仍表示为0xffff_ffff,而不带符号的可以表示为0x000000ff。这样得到的结果就是小于。
对于一些基于GNU的C/C++编译器而言,如果出现一个带符号和一个不带符号的两个数的比较,那么编译器会有相应的warning。所以若要避免这样的warning,那么在比较时可以将其中一个数据类型强制转换一下。对于后两项,如果将前面的带符号类型强制转换为无符号的,那么结果就会相等。
if ((unsigned short)sData > usData)
{
printf("sData > usData\n");
}
else if ((unsigned short)sData < usData)
{
printf("sData < usData\n");
}
else
{
printf("sData = usData\n");
}