【问题标题】:Comparing 8 - bit Unsigned Integer to HEX Failing将 8 位无符号整数与 HEX 进行比较失败
【发布时间】:2016-10-16 23:11:51
【问题描述】:

我有一个 C++ 向量,其中包含来自 TCP 数据段的 uint8_t 值。我正在寻找应该在向量的第一个索引处的两个值中的一个。

我有以下 if 语句来表达我的逻辑。

if ( ui8BufferIn.at(0) != 0xE4 || ui8BufferIn.at(0) != 0xE2){
    printf("\nWe have a problem, no parsing will be done, Package Type = %u\n", ui8BufferIn.at(0));
    proceed = false;
}

上面的 if 语句在不应该执行的时候执行。我得到以下打印输出:

We have a problem, no parsing will be done, Package Type = 226

所以你不必做数学运算,226 作为整数是十六进制的0xE2

我已经有一段时间了,所以它可能很简单,但任何帮助都会很棒!

【问题讨论】:

  • 我怀疑你想要 && 而不是 ||。事实上,您的条件始终评估为真。

标签: c++ hex unsigned-integer


【解决方案1】:

我想你可能希望你的逻辑是:

if ( ui8BufferIn.at(0) != 0xE4 && ui8BufferIn.at(0) != 0xE2){

正如你现在所说的“如果任何一种情况:(不是0xE4)或情况:(不是0xE2),我们就有问题” - 如果我理解正确,那不是你想说什么。使用您的语句,您可能会得到0xE2,但因为您没有得到0xE4 (ui8BufferIn.at(0) != 0xE4),所以您的语句会执行。

【讨论】:

  • 没问题,我们都有那样的日子。 :P
【解决方案2】:

你的逻辑是这样的:

If (value is not (value a)) OR (value is not (value b)) then...

让我们看看可能性:

Value = a: then value is not b: result is true
Value = b: then value is not a: result is true
Value = other: the value is not a: result is true

所以 if 语句的结果总是 true

【讨论】:

  • 赞成...我觉得这句话总是正确的,因为它不能同时是两个谓词错误。
【解决方案3】:

您的代码中有一个小逻辑错误。在这种情况下,您的错误将始终出现。假设uint8_t 的值为0xE2。你会得到以下条件:

if(0xE2 != 0xE4 || 0xE2 != 0xE2)
    //Error

评估结果为:

if(true || false) //Actually the second operand will not be evaluated
    //Error

这将执行您的错误条件。实际上对于任何给定的输入,您的错误函数都会执行。除非您的 uint8_t 值设法与 0xE20xE4 进行比较,但据我所知,目前不存在这样的值。

最简单的解决方案是将“或”更改为“与”,并提供以下代码:

if(ui8BufferIn.at(0) != 0xE4 && ui8BufferIn.at(0) != 0xE2)
    //Error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2021-03-28
    相关资源
    最近更新 更多