我正在尝试查看编译器如何以二进制负数写入,因此这是应该执行的代码
#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/