C语言中memcmp函数为何转为unsigned char而非char?
为什么memcmp要把指针转成unsigned char?
先看函数原型:
int memcmp(const void *s1, const void *s2, size_t n);
核心原因很直接:C标准明确要求memcmp是按无符号字节来逐位比较的。
很多人容易忽略的是,C语言里的char类型符号性是由实现定义的——也就是说,有的平台上char是有符号的(范围通常是-128到127),有的是无符号的(0到255)。如果直接用char*做比较,一旦遇到大于0x7F(也就是127)的字节,在有符号char的平台上会被解析成负数,这时候比较逻辑会完全偏离预期。
举个实际例子:假设要比较字节0xFF和0x7F,如果用有符号char处理,0xFF会被当成-1,0x7F是127,这时候比较会得出0xFF < 0x7F的错误结论;但按无符号规则,0xFF是255,明显大于0x7F,这才是memcmp应该返回的正确结果。
所以把s1和s2转成unsigned char*,是为了强制让所有字节都按无符号值来比较,不管当前平台的char是有符号还是无符号,都能严格符合标准规定的memcmp行为,避免出现平台相关的错误。
内容的提问来源于stack exchange,提问作者Youness Asserare
相关产品推荐
相关产品推荐

