我试图看看编译器如何以二进制负数写入,所以这里应该是代码
#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反之亦然,然后+1,在5的情况下给出(101 ),-5将是(010 + 1)=(011)。请帮助我,如何纠正我的代码,以便它可以正确补充。
答案 0 :(得分:1)
如果你想看到数字位,你最好使用这样的结构:
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;
}
答案 1 :(得分:1)
在C ++中查看位的最简单方法是使用 std::bitset
。它支持iostream输出和转换为/从字符串转换。像这样:
#include <stdio.h> // printf
#include <limits.h> // CHAR_BIT
#include <bitset>
int main()
{
int const bitsPerByte = CHAR_BIT;
int const bitsPerInt = sizeof( int )*bitsPerByte;
int const m = -10;
std::bitset<bitsPerInt> bits( m );
printf(
"%d in decimal is %s in %d-bits binary.\n",
m,
bits.to_string().c_str(),
bitsPerInt
);
}
输出:
十进制的-10是32位二进制的11111111111111111111111111110110。