为什么使用long int而不是int使我的代码正常工作?

时间:2018-09-24 17:03:44

标签: c++ binary int long-integer

#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的可能性。应该可以...

2 个答案:

答案 0 :(得分:4)

您将数字与数字混淆。

(32位)int(是目前为止最常见的)可以容纳2 ^ 32(约40亿个)可能的值。但是每个值都是一个 number 0b100000x1002016是不同的数字,但作为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