为什么memcmp()返回256的差值为1?

时间:2016-05-12 15:27:35

标签: c linux macos unix

请至少告诉我,如果我是白痴或其他什么。不要只是投票。我是学生,需要了解这里发生了什么。谢谢!

所以我必须使用C重新创建memcmp()函数,我的函数按预期工作。它返回两个字符串中不匹配的第一个字符的差异。

我的功能:

int ft_memcmp(const void *s1, const void *s2, size_t n)
{
    unsigned char   *ptr1;
    unsigned char   *ptr2;

    ptr1 = (unsigned char *)s1;
    ptr2 = (unsigned char *)s2;
    while (n && (*ptr1 == *ptr2))
    {
        ptr1++;
        ptr2++;
        n--;
    }
    if (n == 0)
        return (0);
    else
        return (*ptr1 - *ptr2);
}

我的主要内容:

int main(void)
{
    const char  *s1 = "acc";
    const char  *s2 = "abc";
    int         res;

    res = memcmp(s1, s2, 3); 
    printf("%i\n", res);

    return (0);
}

所以这个main将返回256,但是如果你使用我的函数(ft_memcmp)你得到1.显然差异是1而不是256,但为什么原始函数返回256?相差2,我得到512 ...

仅供参考 - 我使用的是Linux Ubuntu 15.10。当我的朋友在他的Mac上测试memcmp时,他得到1而不是256.那真是太棒了!!?

2 个答案:

答案 0 :(得分:2)

  

为什么memcmp()返回256表示差异为1?

首先,正如@where_is_tftp所回答的,$(document).ready(function () { $('.numItems').keyup(function () { var $row = $(this).closest('tr'); var unitPrice = parseFloat($row.find('.priceToCalc').text()); $row.find('.totalAmt').val(this.value * unitPrice); }); }); 唯一需要返回的是memcmp()一些正数和一些比较中的负数。

256而不是1 - 当然是因为优化。

0利用比memcmp()更宽的类型进行比较。

示例:在考虑对齐和总长度后,第一次比较(使用32位char)看到差异,而不是在1的位置(位0),而是256&#39 ; s postilion(第8位)。由于返回256与1一样有效,因此无需简化。请记住unsigned是特定于平台的,它的实现可以完成C代码无法做到的事情 - 比如在数组外安全访问。其他细节在此省略。

memcmp()

答案 1 :(得分:1)

我无法在memcmp旁边找到关于非零返回值的确切值的声明(在手册页或Open Group页面上):

  

非零返回值的符号应由符号确定   第一对字节的值之间的差异(两者都有)   解释为类型unsigned char)在对象中不同   比较。

     

返回值

     

memcmp()函数应返回大于的整数,等于,   或小于0 ,如果s1指向的对象大于,等于   分别来自或小于s2指向的对象。

这里没有说这是字符之间的小数差异。