繁体   English   中英

错误生成十进制到二进制

[英]Error generating decimal to binary

我正在编写一个程序以获取数字的二进制表示形式。 我写了这段代码。

#include <iostream>

using namespace std;
int main() {
    int n, count = 0;;
    int* br = new int();
    cin >> n;
    while (n>0) {
        if (n % 2)
            br[count] = 1;
        else
            br[count] = 0;
        n /= 2;
        count++;
    }
    cout << count << endl;
    for (int i = count - 1; i >= 0; i--) {
        cout << br[i];
    }
    return 0;
}

当我运行上述程序时,出现此错误

Program received signal SIGTRAP, Trace/breakpoint trap.
0x00007ffe8995a2dc in ntdll!RtlpNtMakeTemporaryKey () from C:\Windows\SYSTEM32\ntdll.dll
Single stepping until exit from function ntdll!RtlpNtMakeTemporaryKey,
which has no line number information.
gdb: unknown target exception 0xc0000374 at 0x7ffe8995a31c

Program received signal ?, Unknown signal.
0x00007ffe8995a31c in ntdll!RtlpNtMakeTemporaryKey () from C:\Windows\SYSTEM32\ntdll.dll
Single stepping until exit from function ntdll!RtlpNtMakeTemporaryKey,
which has no line number information.
[Inferior 1 (process 6368) exited with code 0377]

可能是什么原因。 我是C ++的新手。

指令

int* br = new int();

仅分配一个整数。 您应至少分配与要转换的数据一样多的位(32?64?)。 我认为您最好使用静态数组,因此

int br[64] ;

您应该使用一个整数数组来保存各个位。 现在,您的代码正在创建一个动态int:

int* br = new int();

由于int的大小随实现的不同而变化,因此一种可移植的方法是:

#include<climits>
.....
int* br = new int[sizeof(int)*CHAR_BIT];

CHAR_BIT是climits中带有“ char对象中的位数(字节)”的常量。 sizeof(int)是int中的字符数(字节)。 然后将两者相乘即可得出int的位数。

尽管您实际上并不需要动态内存。 改而使用堆栈内存要容易得多,也更合适:

#include<climits>
.....
int br[sizeof(int)*CHAR_BIT];

先前的解决方案存在一个普遍的问题。 它们全部使用一个完整的int来存储单个位。 这意味着浪费了90%以上的存储空间。 对于这样一个简单的示例而言,这个问题显得微不足道,但在大型项目中可能会变成现实。
std :: bitset是改善此问题的绝佳方法:

一个位集存储位(元素只有两个可能的值:0或1,true或false,...)。

该类模拟bool元素的数组,但针对空间分配进行了优化:通常,每个元素仅占用一位(在大多数系统上,此元素比最小元素类型char少八倍)。

#include<climits>
#include<bitset>
.....
bitset<sizeof(int)*CHAR_BIT> br;

std :: bitset的设计如此巧妙,您只需要更改br的声明,它就可以工作,而无需更改其余代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM