64,651
社区成员
发帖
与我相关
我的任务
分享
int __cdecl strcmp (const char *src, const char *dst)
{
int ret = 0 ;
while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
{
++src;
++dst;
}
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
}
这个问题刚回答过
strcmp这样做,是为了可移植性,因为无法确定char 是有符号还是无符号;
对于数值为0、-128的两个字符来说,如果类型为有符号,那么比较的结果为大于,
但是当类型为无符号时,则判断二者小于。
为了避免这种同样的两个字符比较,产生的结果却不同的情况,需要将char 类型
强制转为unsigned char。
这个问题是由unsigned char 与 signed char的取值范围不同造成的
unsigned char 0 -- 255 ,因此 -128被认为是 128
signed char -128 -- 127 ,因此 128 被认为是-128
注:对于二者的交集 0 -- 127 范围内的字符比较,无需转换
for (int i = -128; i<128; ++i)
{
for (int j = -128; j<128; ++j)
{
signed char a = i;
signed char b = j;
if ( (a == b) != ( (unsigned char)a == (unsigned char)b ) )
{
cout<<"i = "<<i;
cout<<"j = "<<j;
cout<<endl;
}
int tempInt1;
tempInt1 = a - b;
int tempInt2;
tempInt2 = (unsigned char)a - (unsigned char)b;
//if ( tempInt1 == 0 )
//{
// cout<<"i = "<<i;
// cout<<"j = "<<j;
// cout<<endl;
//}
if (tempInt1 != tempInt2)
{
cout<<"i = "<<i<<"j = "<<j;
cout<<" int1 = "<<tempInt1<<" int2 = "<<tempInt2;
cout<<endl;
system("pause");
}
}
}
char i = 130;
char b = 100;
printf("%3d\n",i-b);
printf("%3d\n",(unsigned char)i-(unsigned char)b);
signed char a = 0;
signed char b = -128;
signed char c = a - b;