繁体   English   中英

位屏蔽以确定数字是正数还是负数c ++

[英]Bit masking to determine if number is positive or negative c++

我想复制微控制器的行为。

如果程序计数器的存储位置包含0x26那么我要检查下一个存储位置中的值是正还是负。

如果它为正,则将其添加到程序计数器PC ;如果它为负,则将其添加到程序计数器PC ,这实际上是将其减去。

我正在使用位掩码来执行此操作,但是在确定负值时遇到了问题。

           {
                if (value_in_mem && 128 == 128)
                {
                    cout << "\nNext byte is : " << value_in_mem << endl;
                    cout << "\nNumber is positive!" << endl;
                    PC = PC + value_in_mem;
                    cout << "\n(Program Counter has been increased)" << endl;

                }
                else if (value_in_mem && 128 == 0)
                {
                    cout << "\nNext byte is : - " << value_in_mem << endl;
                    cout << "\nNumber is negative!" << endl;
                    PC = PC + value_in_mem;
                    cout << "\n(Program Counter has been decreased)" << endl;
                }
            }

我的方法是&&value_in_mem (一个8位带符号的int)与128( 0b10000000 )一起确定最高有效位分别是1还是0,分别是负数还是postitve。

value_in_mem是一个8位十六进制值,我认为这就是我的困惑所在。 我不完全确定负十六进制值的工作方式,有人可以解释一下这以及我在尝试代码时的错误吗?

1)您正在使用&& ,这是一个逻辑AND,但您应该使用& ,这是按位AND

// It would be better to use hex values when you're working with bits
if ( value_in_mem & 0x80 == 0x80 )
{
    // it's negative
}
else
{
    // it's positive
}

2)您可以简单地将您的值与0比较(如果value_in_mem被声明为char

if ( value_in_mem < 0 )
{
    // it's negative
}
else
{
    // it's positive
}

确保为值使用正确的类型(或将其强制转换为重要类型,例如,如果您希望在大多数情况下将内存值作为无符号字节使用(我当然会),则仅将其转换为有符号的8位整数通过static_cast<int8_t>(value_in_mem)进行特定的计算/比较。

为了说明正确键入的重要性,以及C ++编译器随后将如何为您完成所有肮脏的工作,因此您不必费心使用位,并且还可以使用if (x < 0)

#include <iostream>

int main()
{
    {
        uint16_t pc = 65530;     int8_t b = 0xFF;     pc += b;
        std::cout << pc << "\n"; // unsigned 16 + signed 8
        // 65529 (b works as -1, 65530 - 1 = 65529)
    }
    {
        int16_t pc = 65530;      int8_t b = 0xFF;     pc += b;
        std::cout << pc << "\n"; // signed 16 + signed 8
        // -7 (b works as -1, 65530 as int16_t is -6, -6 + -1 = -7)
    }
    {
        int16_t pc = 65530;      uint8_t b = 0xFF;    pc += b;
        std::cout << pc << "\n"; // signed 16 + unsigned 8
        // 249 (b works as +255, 65530 as int16_t is -6, -6 + 255 = 249)
    }
    {
        uint16_t pc = 65530;     uint8_t b = 0xFF;    pc += b;
        std::cout << pc << "\n"; // unsigned 16 + unsigned 8
        // 249 (b = +255, 65530 + 255 = 65785 (0x100F9), truncated to 16 bits = 249)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM