我编写程序将十进制转换为二进制用于练习目的,但我得到一些奇怪的输出。当使用十进制数进行模数时,我得到正确的值,但数组中的正斜率是什么?我正在使用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 /)?
答案 0 :(得分:7)
你的问题在这里:
array_main[i] = (char) decimal % 2 + '0';
您正在向decimal
投射char
并且正在刷掉高位,因此在某些情况下它会变为负数。应用于负数的%
为负数,因此您在ASCII图表0
之前得到一个字符,即/
。
我还想说,我认为您的宏WRITEL
和WRITE
符合预处理程序滥用的条件。 : - )
答案 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());
}
虽然我没有对此进行过测试,但是如果有任何错误超出简单错别字的水平我会感到惊讶(而且它足够短,似乎没有多少隐藏空间的空间或其中两个,最多)。