将字符与十六进制值进行比较

Lef*_*ris 6 c hex

在最后一天,我的代码中有一个讨厌的错误,经过一些搜索似乎与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个字节与上面的十六进制值的比较,以及它们与字节顺序标记的相反.

任何帮助表示赞赏

Jon*_*ler 9

平原char可以是signedunsigned.如果类型是unsigned,那么一切都按预期工作.如果类型是signed,则分配0xFF c1意味着在-1执行比较时该值将被提升为,但0xFF是常规正整数,因此比较-1 == 0xFF失败.

请注意,类型char,signed charunsigned char是不同的,但是他们两个人有相同的表现(和两个中的一个char).


eri*_*tin 5

比较char和hex时,请务必小心:

使用==运算符将char与0x80进行比较始终会导致错误?

我会建议在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]