我前段时间看到了这个 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
,是否仍然是这种情况?
int16_t
,然后转换为int
(如果int
比int16_t
宽,这可能不是这样,尽管它至少与int16_t
一样宽)。 - Ian Abbott(int16_t)*s1 - (int16_t)*s2
的结果是 254,而(int8_t)254
得到的是一个实现定义的值,可能是 -2。尽管 *s1 > *s2,但 -2 < 0,所以这个结果是错误的。 - user253751(int16_t)*s1 - (int16_t)*s2
中的强制类型转换是不必要的,因为所有小于int的类型在进行任何算术运算之前都必须提升为int。 - phuclv