首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下,char和unsigned char的区别是什么?

在这种情况下,char和unsigned char的区别是什么?
EN

Stack Overflow用户
提问于 2021-11-25 17:19:49
回答 1查看 92关注 0票数 0

这是memchr函数的简单克隆;问题是它既可以与char一起使用,也可以与unsigned char一起使用。

我的问题是为什么这个人说应该是unsigned char

代码语言:javascript
复制
void    *ft_memchr(const void *s, int c, size_t n)
{
    size_t          i;
    unsigned char   *src;

    src = (unsigned char *)s;
    i = 0;
    while (i < n)
    {
        if (src[i] == (unsigned char)c)
            return (src + i);
        i++;
    }
    return (0);
}

这段代码和这段代码有什么区别:

代码语言:javascript
复制
void    *ft_memchr(const void *s, int c, size_t n)
{
    size_t          i;
    char    *src;

    src = (char *)s;
    i = 0;
    while (i < n)
    {
        if (src[i] == (char)c)
            return (src + i);
        i++;
    }
    return (0);
}
EN

回答 1

Stack Overflow用户

发布于 2021-11-26 00:29:04

使用unsigned char时,该行为完全由C标准定义:

  • C 2018 6.2.6.1 3表示unsigned char对象应使用纯二进制表示。脚注清楚地表明unsigned char的所有位都参与此操作,因此它没有填充位。
  • C 2018 6.2.6.1 4保证我们可以使用

2018 6.2.6.1 1和2处理表示任何对象的字节,并允许unsigned char以外的整数类型具有填充位。

出于实际目的,现代C实现在很大程度上消除了charsigned char类型的缺点。但是,在理论上,它们可以具有填充比特(并且作为char访问的存储器中的所有比特可能对其值没有贡献,因此将相同的char值写入另一个存储器位置可能不会再现所有比特),并且它们可以具有表示相同值的多个表示(比特模式)(两个表示0,一个具有正符号比特,一个具有负符号比特)。(整数类型通常也可以有陷阱表示,但C 2018 6.2.6.1 5不允许这些表示对字符类型产生影响。)C 2018 6.2.6.2 3表示,当存储在对象中时,不一定保留“负零”;它可能会成为“正常零”。

因此,从理论上讲,当src[i]char时,它的值可能等于c,即使src[i]的内存中的位与c的位不同,因此memchr例程将返回错误的结果。

您不太可能在实践中遇到这样的C实现,但最终的结果是,C标准使用unsigned char而不是char来保证行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70115117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档