Solved

# Negative Dec to Binary

Posted on 2004-08-08
Medium Priority
464 Views
Below is my program that reads decimal numbers and outputs them in binary code.  Know I am trying to read negative numbers and output them in 2's complement form.  For example, 8 is 0000000000001000 but -8 is 1111111111111000 in 2's complement form.  How can I do this.  I tried changing the <> but this did not work.
my input has these numbers 252,8,9,45,63,74 (uses these numbers for negative as well).

#include <iostream>
#include <fstream>

using namespace std;

void dectobin(int num, int base, int count = 0);

int main()
{
ifstream inFile;
inFile.open("input3.txt");

int decimalnum[6];
int base;
int i;
base = 2;

cout<<"Enter the number in decimal: "<<endl;
if(!inFile)
{
cout<<"Cannot open input file!"<<endl;
return 1;
}
else
for (i=0 ;i<6;i++) {
inFile>>decimalnum[i];
cout<<"Decimal: "<<decimalnum[i]<<" = ";
dectobin(decimalnum[i], base);
cout<< " in Binary" <<endl;
}

return 0;

}
void dectobin(int num, int base, int count)
{
if(num > 0 || count < 16)
{
dectobin(num/base, base, ++count);
cout<<num % base;

}

}
0
Question by:Steve3164
• 2
• 2

LVL 55

Expert Comment

ID: 11747860
Just manage the number always as unsigned

unsigned int unum = *((unsigned int *)yournumber);

That will catch your negative number without trying to make any conversion. If you print unum as usual will show you 2's complement.
0

LVL 39

Expert Comment

ID: 11748605
jaime has it right.

As a binary representation always is unsigned, change your prog that way:

#include <iostream>
#include <fstream>

using namespace std;

void dectobin(int num, int base, int count = 0);

int main()
{
ifstream inFile;
inFile.open("input3.txt");

int decimalnum[6];
int base;
int i;
base = 2;

cout<<"Enter the number in decimal: "<<endl;
if(!inFile)
{
cout<<"Cannot open input file!"<<endl;
return 1;
}
else
for (i=0 ;i<6;i++) {
inFile>>decimalnum[i];
cout<<"Decimal: "<<decimalnum[i]<<" = ";
dectobin(decimalnum[i], base);
cout<< " in Binary" <<endl;
}

return 0;

}
void dectobin(int inp, int base, int count)
{
unsigned int num = (unsigned int)inp;
if(num > 0 || count < 16)
{
dectobin(num/base, base, ++count);
cout<<num % base;

}

}

Regards, Alex

0

Author Comment

ID: 11749818
Alex,

Your information help out but it outputs 32 bits for the negative and I need it to output only 16.  For example, -8 = 1111111111111000 but I get
11111111111111111111111111111000.  How can I do this?
0

LVL 39

Accepted Solution

itsmeandnobodyelse earned 1600 total points
ID: 11751051
Sorry, my fault.

Try that:

void dectobin(int inp, int base, int count)
{
// first cast to 16 bits signed, then to 16 bits unsigned
unsigned short num = (unsigned short)(short)inp;
if(num > 0 || count < 16)
{
dectobin(num/base, base, ++count);
cout<<num % base;

}
}

Regards, Alex
0

LVL 55

Expert Comment

ID: 11756719
Maybe I have not contributed to solve this problem?
0

## Featured Post

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.