十进制到二进制,奇怪的输出

时间:2010-07-14 16:44:45

标签: c++ binary new-operator

我编写程序将十进制转换为二进制用于练习目的,但我得到一些奇怪的输出。当使用十进制数进行模数时​​,我得到正确的值,但数组中的正斜率是什么?我正在使用char数组,只能使用cout<<。

的输出
// web binary converter: http://mistupid.com/computers/binaryconv.htm

#include <iostream>
#include <math.h>
#include <malloc.h> // _msize
#include <climits>
#define WRITEL(x) cout << x << endl;
#define WRITE(x) cout << x;

using std::cout;
using std::endl;
using std::cin;

char * decimalToBinary(int decimal);
void decimal_to_binary_char_array();

static char * array_main;

char * decimalToBinary(int decimal) // tied to array_main
{
   WRITEL("Number to convert: " << decimal << "\n");
   char * binary_array;
   int t = decimal,     // for number of digits
       digits = 0,      // number of digits
       bit_count = 0;   // total digit number of binary number
   static unsigned int array_size = 0;
   if(decimal < 0) { t = decimal; t = -t; }  // if number is negative, make it positive
   while(t > 0) { t /= 10; digits++; }       // determine number of digits
   array_size = (digits * sizeof(int) * 3);  // number of bytes to allocate to array_main
   WRITEL("array_size in bytes: " << array_size);
   array_main = new char[array_size];
   int i = 0;  // counter for number of binary digits
   while(decimal > 0)
   {
      array_main[i] = (char) decimal % 2 + '0';
      WRITE("decimal % 2 = " << char (decimal % 2 + '0') << "  ");
      WRITE(array_main[i] << "  ");
      decimal = decimal / 2;
      WRITEL(decimal);
      i++;
   }
   bit_count = i;
   array_size = bit_count * sizeof(int) + 1;
   binary_array = new char[bit_count * sizeof(int)];
   for(int i=0; i<bit_count+1; i++)
      binary_array[i] = array_main[bit_count-1-i];
   //array_main[bit_count * sizeof(int)] = '\0';
   //WRITEL("\nwhole binary_array: "); for(int i=0; i<array_size; i++) WRITE(binary_array[i]); WRITEL("\n");
   delete [] array_main;
   return binary_array;
}

int main(void)
{

   int num1 = 3001; 
           // 3001    = 101110111001
           // 300     = 100101100
           // 1000    = 1111101000
           // 1200    = 10010110000
           // 1000000 = 11110100001001000000
           // 200000  = 110000110101000000
   array_main = decimalToBinary(num1);
   WRITEL("\nMAIN: " << array_main);

   cin.get();
   delete [] array_main;
   return 0;
}

输出:

Number to convert: 3001

array_size in bytes: 48
decimal % 2 = 1  /  1500
decimal % 2 = 0  0  750
decimal % 2 = 0  0  375
decimal % 2 = 1  1  187
decimal % 2 = 1  /  93
decimal % 2 = 1  1  46
decimal % 2 = 0  0  23
decimal % 2 = 1  1  11
decimal % 2 = 1  1  5
decimal % 2 = 1  1  2
decimal % 2 = 0  1  1
decimal % 2 = 1  1  0

MAIN: 1111101/100/

输出中的正斜杠是什么(1111101/100 /)?

3 个答案:

答案 0 :(得分:7)

你的问题在这里:

array_main[i] = (char) decimal % 2 + '0';

您正在向decimal投射char并且正在刷掉高位,因此在某些情况下它会变为负数。应用于负数的%为负数,因此您在ASCII图表0之前得到一个字符,即/

我还想说,我认为您的宏WRITELWRITE符合预处理程序滥用的条件。 : - )

答案 1 :(得分:2)

必须是array_main[i] = (char) (decimal % 2 + '0');(请注意括号)。但无论如何,代码很糟糕,请从头开始再写。

答案 2 :(得分:0)

我没有尝试详细分析您的所有代码,但只是浏览它并在两个地方看到delete [] array_main;让我产生怀疑。代码的长度也让我怀疑。将数字转换为二进制应该需要大约两到三行代码;当我看到类似十倍的代码时,我倾向于认为详细分析它并不值得麻烦 - 如果我必须这样做,我就重新开始...

编辑:关于如何更好地完成工作,我的立即反应是从这个一般顺序开始:

// warning: untested code.
std::string dec2str(unsigned input) {
    std::deque<char> buffer;
    while (input) {
        buffer.push_front((input & 1)+'0');
        input >>= 1;
   }
   return std::string(&buffer[0], &buffer[0]+buffer.size());
}

虽然我没有对此进行过测试,但是如果有任何错误超出简单错别字的水平我会感到惊讶(而且它足够短,似乎没有多少隐藏空间的空间或其中两个,最多)。