如何使用C语言比较十六进制值?

8

我正在处理十六进制数值。目前为止,我知道如何打印十六进制数值并控制其精度。现在我想要比较这些十六进制数值。比如说,我从一个文件中读取数据到一个char缓冲区中,然后我想要比较这个缓冲区中数据的十六进制值。是否有类似的方法可以实现?

if  hex(buffer[i]) > 0X3F  
then
//do somthing

我该怎么做呢?

5个回答

16

您已经接近成功了:

if (buffer[i] > 0x3f)
{
    // do something
}
请注意,没有必要将任何东西转换为十六进制 - 您可以直接比较字符或整数值,因为十六进制常量(例如0x3f)只是表示整数值的另一种方式。0x3f == 63(十进制)== ASCII“?”。

好的,非常感谢。虽然我的缓冲区包含字符值,但是可以与十六进制进行比较吗? - mainajaved
4
是的,在C和相关语言中,字符(char)实际上只是一种整数类型,所有你能用int做的事情都可以用char来实现。 - Paul R

7

计算机中的数字都是由0和1组成的。无论使用十进制、十六进制或字符(比如'a')表示,其值并不会改变。

因此,与十六进制进行比较时,你不需要进行任何操作。

例如,如果你有:

int a = 71;

以下两个语句是等价的:

if (a == 71)

并且

if (a == 0x47)

4

可以的:

 if  (buffer[i] > 0x3F)

(注意小写x)。 编辑 发现0X3F也应该能正常工作,但我倾向于说这不是C程序员通常写的方式。

好的,非常感谢。虽然我的缓冲区包含字符值,但它可以与十六进制进行比较吗? - mainajaved
十六进制只是一种“表示法”。计算机只“存储”数字,而你将它们解释为字节/字符/浮点数/字符串,你在代码中输入或在屏幕上打印的方式是一种“文本表示法”。 - sehe
@another.anon.coward:显然不是。我只是不习惯看到它大写。 (在使用printf时有一个区别(大写字母A-F)-但这与此无关) - sehe
@sehe:关于 printf 是正确的。通常不使用 X,但是为了让 OP 知道两者都可以工作,在某些情况下可能会看到 X 而不是 x :) - another.anon.coward

2

在将char与hex进行比较时,必须小心:

使用“==”运算符将char与0x80进行比较始终会得到false的结果吗?

我建议使用C99中引入的这种语法来确保准确性。

if (buffer[i] > '\x3f')
{
    // do something
}

它告诉编译器0x3f是char而不是int(类型安全),否则你可能会在比较时遇到问题。

事实上,clang编译器会警告你:

将常量128与类型为'char'的表达式进行比较始终为false [-Werror,-Wtautological-constant-out-of-range-compare]


0

十六进制值并不是新的数据类型,它只是另一种数值方法,例如

int a = 10;

以十六进制形式打印

printf("a in hex value %x ",a);

输出为

a in hex value A

在 if 循环中

if(a == 0xa)
    do something

以十进制表示
printf("a in decimal value %d ",a);

输出为

a in hex value 10

在 if 循环中

if(a == 10)
    do something

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