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

Why does using long int instead of int makes my code work?

#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 种可能性。它应该工作...

您的代码有问题。实际上,不要将基数为 10 的数字转换为基数为 2 的数字。您将数字存储为 int 或 long,这就是为什么它很快变得比 int 或 long 大。这些数字已经以二进制形式保存在我们的计算机中。

如果您真的想打印数字,请参阅 std::bitset

如果你想播放数字,比如设置或清除位,你必须使用一些掩码。或者,更好地使用 c++ 标准库中的 std::bitset

您将数字与数字混淆了。

一个(32 位)int(目前最常见的)可以容纳 2^32(约 40 亿)个可能的值。但是这些值中的每一个都是一个数字0b100000x1002016是不同的数字,但作为int,它们都是相同的数字。在那个级别没有要完成的转换。

您正在做的是尝试将数字用作数字。这会让你头疼。通过乘以 10 进行移位,您可以有效地使用十进制数字作为位。十进制数字的值略高于 3 位 (log210 ~= 3.322),这意味着您的 32 位数字只能毫无问题地表示 10 位。任何超过 1023 的值最终都会变成一个 11 位数字并溢出你的 int.

使用 long int 代替 可以 获得另一个 32 位,如果您的环境有 64 位 long。这将使您的限制达到 19 "bits"(如果您使用 unsigned long,则为 20)。但更好的解决方案是使用字符串代替,如果目标只是查看二进制表示。