生成十进制到二进制的错

时间:2015-09-04 13:37:26

标签: c++ eclipse eclipse-cdt

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

#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 ++的新手。

2 个答案:

答案 0 :(得分:2)

指令

int* br = new int();

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

int br[64] ;

答案 1 :(得分:2)

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

int* br = new int();

由于int的大小从实现变为实现,因此可移植的方法是:

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

CHAR_BIT是一个常量,来自于#char; char对象中的位数(字节)&#34;。 sizeof(int)是int中的字符数(字节)。 并将两者相乘得到int中的位数。

虽然你真的不需要动态记忆。使用堆栈内存更容易也更合适:

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

以前的解决方案有一个共同的问题。所有这些都使用整个int来存储一个位。这意味着浪费了超过90%的存储空间。对于这样一个简单的例子而言,这个问题相当微不足道,但在较大的项目中可能会成为现实 std::bitset是提高效果的绝佳方法:

  

bitset存储位(只有两个可能值的元素:0或1,   是或否,......)。

     

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

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

std :: bitset设计得非常巧妙,您只需更改br的声明即可,无需更改其余代码。