gpt4 book ai didi

使用字符减法的 C strcmp 实现

转载 作者:太空狗 更新时间:2023-10-29 16:22:13 25 4
gpt4 key购买 nike

不久前我看到了 strcmp 的这个实现,我有一个纯粹出于教育目的的问题。为什么需要将输入转换为 16 位整数,进行数学运算,然后再转换回 8 位?在 8 位中做减法有什么问题?

int8_t strcmp (const uint8_t* s1, const uint8_t* s2)
{
while ( *s1 && (*s1 == *s2) )
{
s1++;
s2++;
}

return (int8_t)( (int16_t)*s1 - (int16_t)*s2 );
}

注意:代码假定为 16 位 int 类型。

编辑:提到 C 默认转换为 int(假设 32 位)。即使代码明确声明要转换为 16 位 int 也是这种情况吗?

最佳答案

strcmp(a,b) 函数应该返回

  • <0如果string a < string b
  • >0如果string a > string b
  • 0如果string a == string b

测试实际上是在同一位置的两个字符串中第一个不同的字符上进行的(0,字符串终止符,同样有效)。

这里因为函数需要两个 uint8_t (unsigned char),开发人员可能担心对两个 unsigned char 进行比较会给出 0 之间的数字。和 255 ,因此永远不会返回负值。例如,118 - 236会返回 -118 , 但在 8 位上它将返回 138 .

因此程序员决定转换为int_16 , 有符号整数(16 位)。

如果函数返回 int_16 而不是 int_8 ,并给出正确的负值/正值,这可能会奏效。

(*编辑:来自下方@zwol 的评论,整数提升是不可避免的,因此不需要 int16_t 转换)

然而最后int_8 Actor 打破了逻辑。由于返回值可能来自 -255255 , 其中一些值在转换为 int_8 后会看到它们的符号反转.

例如,执行 255 - 0给出正 255 (在 16 位上,所有低 8 位为 1,MSB 为 0)但在 int_8 中world (signed int of 8 bits) 这是负数,-1 ,因为我们只有最后的低 8 位设置为二进制 11111111 , 或十进制 -1 .


绝对不是一个好的编程示例。

working function来自 Apple 的更好

for ( ; *s1 == *s2; s1++, s2++)
if (*s1 == '\0')
return 0;
return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1);

(Linux 是用汇编代码做的...)

关于使用字符减法的 C strcmp 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34859163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com