#include <iostream>
using namespace std;
int main()
{
long int b2 = 0;
long int i = 1;
int x;
cout << "Enter a number:" ;
cin >> x ;
int y = x;
while (x!=0) {
if ( x%2 )
{
b2 = b2 + i;
}
i = i*10;
x=x/2;
}
cout << "Number " << y << " in base(2) is: " << b2;
}
此代码将任何数字从10转换为二进制。只有一个问题,如果我将变量b2或i的任何一个更改为int而不是long int,并且我插入的数字大于1000,我都会得到一些奇怪的结果,有时是负数。 我正在使用Ubuntu 18.04和code :: blocks进行编译。我进行了研究,但找不到真正的答案。 int有4个字节,这意味着2 ^ 32的可能性。应该可以...
答案 0 :(得分:4)
您将数字与数字混淆。
(32位)int
(是目前为止最常见的)可以容纳2 ^ 32(约40亿个)可能的值。但是每个值都是一个 number 。 0b10000
,0x10
,020
和16
是不同的数字,但作为int
,它们都是相同的数字。在该级别上无需进行转换。
您正在做的是尝试将数字用作数字。这将使您头痛。通过乘以10进行移位,可以有效地使用十进制数字作为位。十进制数字值得超过3位(log 2 10〜= 3.322),这意味着您的32位数字只能表示10位,没有问题。超过1023的任何值都将最终变为11位数字,并会使您的int
溢出。
如果环境中有64位long int
,则使用long
代替 可以使您再获得32位。这样您的限制最多为19个“位”(如果使用unsigned long
,则为20个位)。但是,如果目标只是为了查看二进制表示形式,那么更好的解决方案是使用字符串代替。
答案 1 :(得分:3)
您的代码有问题。实际上,请不要将以10为底的数字转换为以2为底的数字。将数字存储为int或long类型,这就是为什么它很快变得比int或long大小大的原因。这些数字已经以二进制形式保存在我们的计算机中。
如果您确实要打印数字,请参见std::bitset
。
如果要播放数字,例如设置或清除位,则必须使用一些掩码。或者,最好使用c ++标准库中的std::bitset
;