C 使用无符号字符和字符
我查看了strCmp()的许多实现,发现大多数指针实现都是使用无符号字符完成的 我的问题是为什么使用“unsigned”作为回报,即使我们没有使用它,我们也会得到相同的结果(基于我做的测试) 如果我没有使用它,我会得到一些值的错误结果吗 最后,默认情况下字符是无符号的还是有符号的 例1C 使用无符号字符和字符,c,C,我查看了strCmp()的许多实现,发现大多数指针实现都是使用无符号字符完成的 我的问题是为什么使用“unsigned”作为回报,即使我们没有使用它,我们也会得到相同的结果(基于我做的测试) 如果我没有使用它,我会得到一些值的错误结果吗 最后,默认情况下字符是无符号的还是有符号的 例1 int strCmp(const char* s1, const char* s2) { while(*s1 && (*s1 == *s2)) { s1++;
int strCmp(const char* s1, const char* s2)
{
while(*s1 && (*s1 == *s2))
{
s1++;
s2++;
}
return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
例2
int strCmp(const char *S1, const char *S2)
{
for(; *S1 == *S2; ++S1, ++S2)
if(*S1 == 0)
return 0;
return *(unsigned char *)S1 < *(unsigned char *)S2 ? -1 : 1;
}
int strCmp(常量字符*S1,常量字符*S2)
{
对于(;*S1==*S2;++S1,++S2)
如果(*S1==0)
返回0;
返回*(无符号字符*)S1<*(无符号字符*)S2?-1:1;
}
我的问题是为什么使用“unsigned”作为回报,即使我们没有使用它,我们也会得到相同的结果(基于我做的测试)
算术是用int
类型完成的,因此如果char
是有符号的,则会因为符号扩展而得到负数字符的错误值
示例:假设您的字符宽度为8位,并用2的补码签名。然后,代码点128处的字符的整数值为-128
,因此比较起来小于[0127]范围内的任何值,而不是您想要的值。首先强制转换为无符号字符
可确保整数值为128
最后,默认情况下字符是无符号的还是有符号的
事实上,这是实现定义的。因此,请明确使用无符号字符
我查看了strCmp()的许多实现,发现大多数指针实现都是使用无符号字符完成的
实现标准C库函数的代码int strcmp(const char*s1,const char*s2)指定了代码>以执行比较,就像字符串由无符号字符组成一样。如果char
被实现为signed char
或unsigned char
,则此项适用
对于本子条款中的所有函数,每个字符应被解释为具有类型无符号字符C11§7.24.1 3
字符是有符号的还是无符号的并不是标准化的,而是留给实现。在较旧的编译器中,默认情况下通常未签名,而今天的编译器通常可以选择更改它。对于strcmp()的返回值来说,这是行不通的,您会看到库实现者选择了一个可预测的值。
// Example that performs the correct compare without a possibility of overflow.
int strCmp(const char* s1, const char* s2) {
const unsigned char *u1 = (const unsigned char *) s1;
const unsigned char *u2 = (const unsigned char *) s2;
while((*u1 == *u2) && *u1) {
u1++;
u2++;
}
return (*u1 > *u2) - (*u1 < *u2);
}
return *(const unsigned char*)s1 - *(const unsigned char*)s2;