【问题标题】:How to compare hex values using C?如何使用 C 比较十六进制值?
【发布时间】:2011-12-07 17:18:06
【问题描述】:

我正在使用十六进制值。到目前为止,我知道如何打印十六进制值和精度。现在我想比较十六进制值。例如,我正在将文件中的数据读入 char 缓冲区。现在我想比较缓冲区中数据的十六进制值。有这样的吗?

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

我该怎么做?

【问题讨论】:

    标签: c hex


    【解决方案1】:

    你快到了:

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

    请注意,无需将任何内容“转换”为十六进制 - 您可以直接比较字符或整数值,因为 0x3f 等十六进制常量只是表示整数值的另一种方式。 0x3f == 63(十进制)== ASCII '?'。

    【讨论】:

    • 好的,先生,非常感谢。虽然我的缓冲区包含字符值,但它可以与十六进制进行比较?
    • 是的 - char 实际上只是 C 和相关语言中的一种整数 - 你可以用 int 做的任何事情你也可以用 char 做。
    【解决方案2】:

    是的,你可以:

     if  (buffer[i] > 0x3F)
    

    (注意小写的 x)。 编辑事实证明0X3F 应该也能正常工作,但我想说这不是 C 程序员通常写的)。

    【讨论】:

    • 好的,先生,非常感谢。虽然我的缓冲区包含字符值,但它可以与十六进制进行比较?
    • hex 只是一个表示。计算机仅存储数字,您将它们解释为字节/字符/浮点数/字符串,而您在代码中键入它们或将它们打印到屏幕上的方式是文本表示
    • @another.anon.coward:显然不是。我只是不习惯看到它大写。 (使用 printf(大写字母 A-F)时有区别——但这在这里无关
    • @sehe:关于printf 是真的。同样正确的是,通常不使用 X,但只是为了让 OP 知道两者都有效,以防在某处看到 X 而不是 x :)
    【解决方案3】:

    计算机中的数字都是 0 和 1。以 10 为底、以 16 为底(十六进制)或作为字符(例如 'a')查看它们不会改变数字。

    所以,与十六进制比较,你不需要做任何事情。

    例如,如果你有

    int a = 71;
    

    那么下面两个语句是等价的:

    if (a == 71)
    

    if (a == 0x47)
    

    【讨论】:

      【解决方案4】:

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

      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
      

      【讨论】:

        【解决方案5】:

        在比较 char 和 hex 时必须小心:

        Using the == operator to compare a char to 0x80 always results in false?

        我会推荐这种在 C99 中引入的语法以确保

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

        它告诉编译器 0x3f 是一个 char 而不是一个 int(类型安全),否则你很可能会发现这个比较有问题。

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

        常数 128 与 'char' 类型表达式的比较总是错误的 [-Werror,-Wtautological-constant-out-of-range-compare]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-25
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          • 1970-01-01
          相关资源
          最近更新 更多