如何将一个字节与十六进制值进行比较测试?

3

我想测试从数据文件中读取的字节是否为0xEE,应该怎么做? 我尝试过if (aChar == 0xEE),但似乎不起作用。


3
这正是您测试字符或任何其他数字类型与十六进制值相比较的方法。哪里出了问题?请发布一些源代码。 - James McNellis
aChar的类型是什么?它是一个指针吗? - Mark Byers
2个回答

9

当读取有符号字符时,其值永远不会是0xEE。即:

#include <stdio.h>

int main()
{
    char c = 0xEE;   // assumes your implementation defines char as signed char
    // c is now -18
    if (c == 0xEE)
    {
        printf("Char c is 0xEE");
    }
    else
    {
        printf("Char c is NOT 0xEE");
    }

}

输出结果为:
Char c is NOT 0xEE

读取有符号字符时,其值范围为-0x7F至0x80。无符号字符从0x00到0xFF进行解释,通常用于“原始”字节。

更改:

char aChar;

为了

unsigned char aChar;

并且它应该能够正常工作。


4
需要注意的是,普通的字符可以是有符号的或无符号的;这取决于实现方式。 - James McNellis
@Martin 这是完全的语义问题。我知道你可以将它赋值为0xFF,但如果测试一个有符号字符是否为0xFF,它总是会失败。 - Doug T.
只是重申一下詹姆斯·麦克内利斯所说,你的例子是否有效取决于具体实现。 - rlbond
@Doug T:为什么它总是会失败?如果0xEE在char中无法表示,那么它会被转换为相应的负值,然后可能与char相等。 - jalf
1
如果char是带符号的类型,那么char c = 0xEE;会导致c成为一个负值(-18),测试c == 0xEE将总是失败。由于十六进制整数字面量0xEE是类型为int的,因此用于比较时char将被提升为int-18 != 238. - James McNellis

6
使用字符常量可以避免任何实现定义的有符号/无符号字符类型问题:
if( aChar == '\xee' )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接