【问题标题】:Comparing two Hexadecimal values in C++比较 C++ 中的两个十六进制值
【发布时间】:2010-07-29 20:07:05
【问题描述】:

我想比较两个十六进制(长存储) 下面是我的代码

long constant = 80040e14;
if(constant == 80040e14)
    cout<<"Success"<<endl;
else
    cout<<"Fail!!"<<endl;

在此代码流控制总是返回到else部分,谁能建议如何进行比较。

谢谢

Santhosha K

【问题讨论】:

  • @Binary Worrier:它仅使用 e 字符编译(因为它被视为指数)。对于每个其他十六进制字符,它都是编译器错误。
  • 这些数字不是整数。他们是双打。尝试用 BAADF00D 或 DEADBEEF 做同样的事情,看看会发生什么。
  • @Naveen:当然!我可能曾经知道你可以这样做,但如果我这样做了,那是 20 年前的事了,后来被更重要的东西赶走了,可能是我妻子的名字 :) 谢谢伙计。

标签: c++


【解决方案1】:

用“0x”作为常量前缀。

您的常量中只有“e”,编译器会将以下形式的数字视为科学记数法:NNNeEEE。使用 '0x' 前缀告诉编译器以下字符是十六进制表示法。

在您的代码中,80040e14 是 8004000000000000000,它太大而无法放入 32 位值,但可以放入 64 位值。但是,80040e14 是一个浮点数,因此比较会将 long 转换为 float 以使其与常量类型相同,因此由于浮点代码的复杂性,这两个值会有所不同。

【讨论】:

    【解决方案2】:

    你需要在 C++ 中的十六进制数字前面加上 0x

    【讨论】:

      【解决方案3】:

      对于十六进制值,您需要在常量前加上0x 否则e 将被视为指数并且该值被解释为巨大的十进制 值。在您的情况下,该值很可能无法长时间存储并且溢出。由于此溢出,您的比较检查失败。

      【讨论】:

        【解决方案4】:

        要比较两个值,请使用 == 运算符。 唯一需要考虑的是告诉编译器哪个基是使用的值:

        • 十进制:像在“现实生活”中一样写数字。示例:1(一)、2(二)、3(三)、...

        • 十六进制:必须将 0x 附加到值。示例:0x01(一)、0x02(二)、0x03(三)、...

        • 二进制:追加 0b。示例:0b01(一)、0xb10(二)、0b11(三)。 编辑: 似乎这不是真的。不要相信这个功能。

        在您的示例中,只需执行以下操作:

        long constant = 0x80040e14;
        if(constant == 0x80040e14L)
            cout<<"Success"<<endl;
        else
            cout<<"Fail!!"<<endl;
        

        【讨论】:

        • C++ 没有文字的二进制格式。 “0x”前缀表示十六进制,“0”前缀表示八进制数。 “0b01”和“0b11”都会产生编译器错误(“b”是无效的八进制字符),“0xb10”是十进制的 2832。
        • 糟糕,这是我只在 C 中使用的功能,我错误地认为 C++ 继承了它。
        • 它也不是 C(可能是编译器扩展)
        • 也许,我在嵌入式系统的编译器中使用了它。我已经编辑了我的答案。
        【解决方案5】:

        你想比较一个十六进制吗?
        使用0x80040e14 -> 注意0x 前缀让编译器知道它是十六进制格式。

        您编写它的方式,编译器可能会尝试将其解析为浮点数(e 表示指数),但我实际上并没有尝试查看它是如何处理的。

        【讨论】:

        • Gnu g++ 4.4.3 给出了这个警告:“隐式常量转换溢出”
        【解决方案6】:

        80040e14 是双精度。当分配给 long 时,它变为零。 80040e14L 是长双。 表达式

        constant == 80040e14L
        

        将常量提升为长双精度,这样你就有了

        0.0 == 80040e14
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-16
          • 1970-01-01
          • 1970-01-01
          • 2011-12-07
          • 2011-05-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多