使用unsigned char和char

时间:2018-04-04 16:28:00

标签: c

我查看了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;
  }

2 个答案:

答案 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 charunsigned char,则适用。

  

对于本子条款中的所有函数,每个字符都应被解释为具有类型unsigned charC11§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;