在最后一天,我的代码中有一个讨厌的错误,经过一些搜索似乎与char值和hex之间的比较有关.我的编译器是在Windows上运行的gcc 4.4.1.我在下面的简单代码中复制了这个问题:
char c1 = 0xFF; char c2 = 0xFE;
if(c1 == 0xFF && c2 == 0xFE)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,上面的代码没有进入循环.我完全不知道为什么,并且真的很感激一些帮助.这是荒谬的,解决方案必须(一如既往)是我完全忽视的一个巨大错误.
如果我用无符号字符替换上面的字符,它可以工作,但仅限于某些情况.我正在努力找出发生了什么.另外,如果我将十六进制值转换为char,它会正确地进入循环,如下所示:
if(c1 == (char)0xFF && c2 == (char)0xFE)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
那是什么意思?它为什么会发生?原始十六进制值是否默认解释为char?对于我的代码中的好奇点,我首先注意到它是一个流的前2个字节与上面的十六进制值的比较,以及它们与字节顺序标记的相反.
任何帮助表示赞赏
平原char可以是signed或unsigned.如果类型是unsigned,那么一切都按预期工作.如果类型是signed,则分配0xFF c1意味着在-1执行比较时该值将被提升为,但0xFF是常规正整数,因此比较-1 == 0xFF失败.
请注意,类型char,signed char和unsigned char是不同的,但是他们两个人有相同的表现(和两个中的一个char).
比较char和hex时,请务必小心:
我会建议在C99中引入此语法,以确保
if(c1 == '\xFF' && c2 == '\xFE')
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
避免强制转换,这是不必要的,也不安全。
它告诉编译器0xFF是一个char而不是一个int,这将解决您的问题。
clang编译器还会警告您:
常量128与类型为'char'的表达式的比较始终为假[-Werror,-Wtautologic-constant-of-range-compare]