我查看了strCmp()的许多实现,发现大多数指针实现都是使用unsigned char
完成的。我的问题是为什么" unsigned"即使我们没有使用它,我们也会得到相同的结果(基于我所做的测试)?
如果我没有使用它,我会为某些值得到错误的结果吗?
最后,char是无符号还是默认签名?
示例1
int strCmp(const char* s1, const char* s2)
{
while(*s1 && (*s1 == *s2))
{
s1++;
s2++;
}
return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
示例2
int strCmp(const char *S1, const char *S2)
{
for(; *S1 == *S2; ++S1, ++S2)
if(*S1 == 0)
return 0;
return *(unsigned char *)S1 < *(unsigned char *)S2 ? -1 : 1;
}
答案 0 :(得分:9)
我的问题是为什么&#34; unsigned&#34;即使我们没有使用它,我们也会得到相同的结果(基于我的测试)?
算术是使用int
类型完成的,所以如果 char
已签名,那么因为符号扩展它们,您将得到错误的字符值。
示例:假设您的字符宽度为8位,并使用2的补码进行签名。然后代码点128处的字符将具有整数值-128
,因此比更小比<0,127]范围内的任何一个更小,而不是你想要的。首先转换为unsigned char
,确保整数值为128
。
最后,char是无符号还是默认签名?
事实上,这是实现定义的。所以,明确地使用 unsigned char 来确定。
答案 1 :(得分:1)
我查看了strCmp()的许多实现,发现大多数指针实现都是使用unsigned char
完成的。
实现标准C库函数int strcmp(const char *s1, const char *s2);
的代码指定以执行比较,就像字符串由unsigned char
个字符组成一样。如果char
实施为signed char
或unsigned char
,则适用。
对于本子条款中的所有函数,每个字符都应被解释为具有类型
unsigned char
C11§7.24.13
// Example that performs the correct compare without a possibility of overflow.
int strCmp(const char* s1, const char* s2) {
const unsigned char *u1 = (const unsigned char *) s1;
const unsigned char *u2 = (const unsigned char *) s2;
while((*u1 == *u2) && *u1) {
u1++;
u2++;
}
return (*u1 > *u2) - (*u1 < *u2);
}
在unsigned char
==范围unsigned
的稀有机器上,下面失败。
return *(const unsigned char*)s1 - *(const unsigned char*)s2;