【发布时间】:2016-04-23 21:15:39
【问题描述】:
不久前我看到了strcmp 的这种实现,我有一个纯粹用于教育目的的问题。为什么需要将输入转换为 16 位整数,进行数学运算,然后再转换回 8 位? 8bit做减法有什么问题?
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 也是这种情况吗?
【问题讨论】:
-
不符合标准的,请勿使用。
-
关于您的EDIT,是的,情况仍然如此。理论上,这些值被转换为
int16_t,然后转换为int(如果int比int16_t宽,它可能不是,尽管它至少与int16_t一样宽)。 -
也许重点是保证不可移植性。
int8_t和int16_t在没有这些大小的本机硬件类型的系统上不存在。 -
如果 *s1 是 255 而 *s2 是 1 怎么办?然后
(int16_t)*s1 - (int16_t)*s2产生 254,(int8_t)254产生一个实现定义的值,可能是 -2。 -2 *s2 所以这个结果是错误的。 -
(int16_t)*s1 - (int16_t)*s2中的强制转换是不必要的,因为所有小于 int 的类型必须在任何算术运算之前提升为 int
标签: c