我正在尝试查看编译器如何以二进制负数写入,因此这是应该执行的代码

#include <cstdlib>
#include <iostream>
using namespace std;
void complement(int n)
{
    int l = n;
    int s = 0;
    int k = 0;
    int m = 0;

    while (n != 0)
    {
        s = n  %  2;
        n /= 2;
        cout << s << "  ";
    }

    cout << endl;
    m = ~l + 1;
    cout << m << endl;
    cout << endl;

    while (m != 0)
    {
        int k = m  %  2;
        m /= 2;
        cout << k << "  ";
    }
}

int main(int argc, char *argv[])
{
    int n;
    cin >> n;
    cout << endl;
    complement(n);
    system("PAUSE");
    return EXIT_SUCCESS;
}


但是奇怪的是,例如,当我输入5时,它的二进制形式显然是3位的101,它的补数-5表示为-10-1?这是我的代码输出显示的内容,但是我知道这是不正确的,因为任何数字的2的补码都是通过反转其位来给出的,0到1反转,反之亦然,如果是5(101,则+1) ),-5为(010 + 1)=(011)。请帮助我,如何更正我的代码,以便可以正确地补充代码。

最佳答案

如果要查看数字位数,最好使用以下结构:

int main(int argc, _TCHAR* argv[])
{
    int i = -10; //my value
    std::string result;
    for (int bit = 0; bit < sizeof(int)*8; ++bit)
    {
       int bit_val = 1 & i;
       result = (bit_val ? "1" : "0") + result;
       i = i >> 1;
    }
    std::cout << result << std::endl;
}

关于c++ - 补码算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7582690/

10-11 16:33