Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用无符号字符和字符_C - Fatal编程技术网

C 使用无符号字符和字符

C 使用无符号字符和字符,c,C,我查看了strCmp()的许多实现,发现大多数指针实现都是使用无符号字符完成的 我的问题是为什么使用“unsigned”作为回报,即使我们没有使用它,我们也会得到相同的结果(基于我做的测试) 如果我没有使用它,我会得到一些值的错误结果吗 最后,默认情况下字符是无符号的还是有符号的 例1 int strCmp(const char* s1, const char* s2) { while(*s1 && (*s1 == *s2)) { s1++;

我查看了strCmp()的许多实现,发现大多数指针实现都是使用无符号字符完成的

我的问题是为什么使用“unsigned”作为回报,即使我们没有使用它,我们也会得到相同的结果(基于我做的测试)

如果我没有使用它,我会得到一些值的错误结果吗

最后,默认情况下字符是无符号的还是有符号的

例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;
  }
int strCmp(常量字符*S1,常量字符*S2)
{
对于(;*S1==*S2;++S1,++S2)
如果(*S1==0)
返回0;
返回*(无符号字符*)S1<*(无符号字符*)S2?-1:1;
}
我的问题是为什么使用“unsigned”作为回报,即使我们没有使用它,我们也会得到相同的结果(基于我做的测试)

算术是用
int
类型完成的,因此如果
char
是有符号的,则会因为符号扩展而得到负数字符的错误值

示例:假设您的字符宽度为8位,并用2的补码签名。然后,代码点128处的字符的整数值为
-128
,因此比较起来小于[0127]范围内的任何值,而不是您想要的值。首先强制转换为
无符号字符
可确保整数值为
128

最后,默认情况下字符是无符号的还是有符号的

事实上,这是实现定义的。因此,请明确使用无符号字符

我查看了strCmp()的许多实现,发现大多数指针实现都是使用无符号字符完成的

实现标准C库函数的代码int strcmp(const char*s1,const char*s2)以执行比较,就像字符串由
无符号字符组成一样。如果
char
被实现为
signed char
unsigned char
,则此项适用

对于本子条款中的所有函数,每个字符应被解释为具有类型
无符号字符
C11§7.24.1 3


字符是有符号的还是无符号的并不是标准化的,而是留给实现。在较旧的编译器中,默认情况下通常未签名,而今天的编译器通常可以选择更改它。对于strcmp()的返回值来说,这是行不通的,您会看到库实现者选择了一个可预测的值。
// 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);
}
return *(const unsigned char*)s1 - *(const unsigned char*)s2;