<code> 2진수의 덧셈 질문이요
#include
#include
void main()
{
int i, n1, n2, x, count=0; //변수를 선언합니다. i는 반복문을 쓰기위해, iuput은 입력 받은 수를 저장, arrary[32]는 배열로서 int형이 4바이트(32비트)이기 때문에 크기를 32, count=0 양,음수로 나누기위해서ㅡ
int array1[8]={0,},array2[8]={0,},array3[8]={0,};
printf("<<10진수 입력받아 2진수로 출력하기 프로그램 시작>>\n"); //생략
printf("정수 1개 입력: "); //생략
scanf("%d",&n1); //수를 입력받고 그 수를 iuput에 저장
if(n1<=0) //입력받은 수가 양수가 아니경우 iuput = -iuput, count=1로
n1=-n1, count=1; //count를 1로 함으로서ㅡ 나중에 처리한다. iuput을 양수화한다음 나중에 보수를 취하는 방식
for(i=0; i<=7; i++) //입력된수가 음수이든 양수이든 현제 iuput는 양수이고 그 수를 나누면서 각 비트에 0,1을 결정
{ //현제 입력된 0,1은 역순으로 입력되있다ㅡ (예: 4비트 2의 경우 0010 ==> 이 반복문에 의하면 0100)
array1[i]=n1%2; //계산과정이므로 생략
n1=n1/2;
}
if(count==0) //입력된 수iuput가 0보다 크다면 위에 조건문(if문)을 안거쳤기때문에 처음 초기값 0을 갖을것이다.
{
for(i=7; i>=0; i--) //위에 for문에서 arrary[]에 저장한 0,1을 출력 위에서 역순으로 저장했기때문에
printf("%d",array1[i]); //arrary[0]부터 출력하는게 아니라ㅡ arrary[31](마지막)부터 역으로 출력
printf("\n");
}
if(count==1) //입력된 수가 0보다 작거나 같았다면 처음 if문에서 iuput=-iuput, count=1; 을 거쳤기때문에
{ //iuput 가 만일 -3 이였다면 현제 iuput는 3, count는 1
for(i=7; i>=0; i--) //1의 보수를 취한다ㅡ 처음 입력한 수의 절대값에 해당하는 수를 위에서 0,1 이진수로 나타낸것을
{
if(array1[i]==0) //0이면 1로
array1[i]=1;
else //0이 아닌 1이면 0으로
array1[i]=0;
}
array1[0]+=1; //arrary[0]은 2진수로 표현했을때 맨 마지막(오른쪽) 자리다ㅡ 마지막 자리에 1을 더함으로서
//2의 보수를 취합니다.
for(i=0; i<=8; i++) //위에서 2의 보수를 취하면서 1을 더해줬기때문에 arrary[]에 0,1 뿐만 아니라 2까지 표현되있을수 있습니다.
{
if(array1[i]==2) //어떤 자리가 2일경우 2진수에서 그자리는 0이되고 , 한자리 위는 1을 더합니다.
{
array1[i]=0;
array1[i+1]+=1;
}
}
for(i=7; i>=0; i--) //이제 음수일때 2의 보수를 취하는것까지 계산이 끝난 arrary[]를 출렵합니다.
printf("%d",array1[i]); //역시 역순으로 했기때문에 arrary[31]부터 출력합니다.
printf("\n");
}
printf("정수 1개 입력: "); //생략
scanf("%d",&n2); //수를 입력받고 그 수를 iuput에 저장
if(n2<=0) //입력받은 수가 양수가 아니경우 iuput = -iuput, count=1로
n2=-n2, count=1; //count를 1로 함으로서ㅡ 나중에 처리한다. iuput을 양수화한다음 나중에 보수를 취하는 방식
for(i=0; i<=7; i++) //입력된수가 음수이든 양수이든 현제 iuput는 양수이고 그 수를 나누면서 각 비트에 0,1을 결정
{ //현제 입력된 0,1은 역순으로 입력되있다ㅡ (예: 4비트 2의 경우 0010 ==> 이 반복문에 의하면 0100)
array2[i]=n2%2; //계산과정이므로 생략
n2=n2/2;
}
if(count==0) //입력된 수iuput가 0보다 크다면 위에 조건문(if문)을 안거쳤기때문에 처음 초기값 0을 갖을것이다.
{
for(i=7; i>=0; i--) //위에 for문에서 arrary[]에 저장한 0,1을 출력 위에서 역순으로 저장했기때문에
printf("%d",array2[i]); //arrary[0]부터 출력하는게 아니라ㅡ arrary[31](마지막)부터 역으로 출력
printf("\n");
}
if(count==1) //입력된 수가 0보다 작거나 같았다면 처음 if문에서 iuput=-iuput, count=1; 을 거쳤기때문에
{ //iuput 가 만일 -3 이였다면 현제 iuput는 3, count는 1
for(i=7; i>=0; i--) //1의 보수를 취한다ㅡ 처음 입력한 수의 절대값에 해당하는 수를 위에서 0,1 이진수로 나타낸것을
{
if(array2[i]==0) //0이면 1로
array2[i]=1;
else //0이 아닌 1이면 0으로
array2[i]=0;
}
array2[0]+=1; //arrary[0]은 2진수로 표현했을때 맨 마지막(오른쪽) 자리다ㅡ 마지막 자리에 1을 더함으로서
//2의 보수를 취합니다.
for(i=0; i<=8; i++) //위에서 2의 보수를 취하면서 1을 더해줬기때문에 arrary[]에 0,1 뿐만 아니라 2까지 표현되있을수 있습니다.
{
if(array2[i]==2) //어떤 자리가 2일경우 2진수에서 그자리는 0이되고 , 한자리 위는 1을 더합니다.
{
array2[i]=0;
array2[i+1]+=1;
}
}
for(i=7; i>=0; i--) //이제 음수일때 2의 보수를 취하는것까지 계산이 끝난 arrary[]를 출렵합니다.
printf("%d",array2[i]); //역시 역순으로 했기때문에 arrary[31]부터 출력합니다.
printf("\n");
x=0;
x=n1,n2;
x=x+array1[i]+array2[i];
}
printf("덧셈 결과는?: "); //생략
if(x<=0) //입력받은 수가 양수가 아니경우 iuput = -iuput, count=1로
x=-x, count=1; //count를 1로 함으로서ㅡ 나중에 처리한다. iuput을 양수화한다음 나중에 보수를 취하는 방식
for(i=0; i<=7; i++) //입력된수가 음수이든 양수이든 현제 iuput는 양수이고 그 수를 나누면서 각 비트에 0,1을 결정
{ //현제 입력된 0,1은 역순으로 입력되있다ㅡ (예: 4비트 2의 경우 0010 ==> 이 반복문에 의하면 0100)
array3[i]=x%2; //계산과정이므로 생략
x=x/2;
}
if(count==0) //입력된 수iuput가 0보다 크다면 위에 조건문(if문)을 안거쳤기때문에 처음 초기값 0을 갖을것이다.
{
for(i=7; i>=0; i--) //위에 for문에서 arrary[]에 저장한 0,1을 출력 위에서 역순으로 저장했기때문에
printf("%d",array3[i]); //arrary[0]부터 출력하는게 아니라ㅡ arrary[31](마지막)부터 역으로 출력
printf("\n");
}
if(count==1) //입력된 수가 0보다 작거나 같았다면 처음 if문에서 iuput=-iuput, count=1; 을 거쳤기때문에
{ //iuput 가 만일 -3 이였다면 현제 iuput는 3, count는 1
for(i=7; i>=0; i--) //1의 보수를 취한다ㅡ 처음 입력한 수의 절대값에 해당하는 수를 위에서 0,1 이진수로 나타낸것을
{
if(array3[i]==0) //0이면 1로
array3[i]=1;
else //0이 아닌 1이면 0으로
array3[i]=0;
}
array3[0]+=1; //arrary[0]은 2진수로 표현했을때 맨 마지막(오른쪽) 자리다ㅡ 마지막 자리에 1을 더함으로서
//2의 보수를 취합니다.
for(i=0; i<=8; i++) //위에서 2의 보수를 취하면서 1을 더해줬기때문에 arrary[]에 0,1 뿐만 아니라 2까지 표현되있을수 있습니다.
{
if(array3[i]==2) //어떤 자리가 2일경우 2진수에서 그자리는 0이되고 , 한자리 위는 1을 더합니다.
{
array3[i]=0;
array3[i+1]+=1;
}
}
for(i=7; i>=0; i--) //이제 음수일때 2의 보수를 취하는것까지 계산이 끝난 arrary[]를 출렵합니다.
printf("%d",array3[i]); //역시 역순으로 했기때문에 arrary[31]부터 출력합니다.
printf("\n");
}
}
제가 한건데 2진수의 덧셈을 하면 원하는 결과값이 안나옵니다.
참고해보세요.
크게 3단위로 나뉘네요.
- 10진수를 ---> int 형 2진수 8개로 변환
- 2진수 숫자8개를 ---> 10진수로 변환 ★★★★★ 이건 제가 추가한 코드죠.
- 10진수 숫자 2개를 더하기
- 10진수를 ---> int 형 2진수 8개로 변환해서 출력으로 마무리.
음수값 처리가 되기는 하지만. 정확한지는 제가 잘 모르겠습니다.
[%
#include
#include
//http://kldp.org/node/153680
//생성 OK --------------------------
//초기화 OK -------------------------
//사용 OK -------------------------
//해제 OK -------------------------
int main(int argc, char** argv)
{
//생성 OK --------------------------
//초기화 OK -------------------------
int i, n1, n2, x, count=0; //변수를 선언합니다. i는 반복문을 쓰기위해, iuput은 입력 받은 수를 저장, arrary[32]는 배열로서 int형이 4바이트(32비트)이기 때문에 크기를 32, count=0 양,음수로 나누기위해서ㅡ
int array1[8]= {
0,
}
,
array2[8]= {
0,
}
,
array3[8]= {
0,
};
//입력 OK -------------------------
printf("<<10진수 입력받아 2진수로 출력하기 프로그램 시작>>\n"); //생략
printf("정수 1개 입력: "); //생략
scanf("%d",&n1); //수를 입력받고 그 수를 iuput에 저장
if(n1<=0)//입력받은 수가 양수가 아니경우 iuput = -iuput, count=1로
n1=-n1, count=1; //count를 1로 함으로서ㅡ 나중에 처리한다. iuput을 양수화한다음 나중에 보수를 취하는 방식
//입력 OK -------------------------
for(i=0; i<=7; i++) //입력된수가 음수이든 양수이든 현제 iuput는 양수이고 그 수를 나누면서 각 비트에 0,1을 결정
{
//현제 입력된 0,1은 역순으로 입력되있다ㅡ (예: 4비트 2의 경우 0010 ==> 이 반복문에 의하면 0100)
array1[i]=n1%2; //계산과정이므로 생략
n1=n1/2;
printf("[%d:%d] ", array1[i], n1);
}
//역순 OK -------------------------
if(count==0) //입력된 수iuput가 0보다 크다면 위에 조건문(if문)을 안거쳤기때문에 처음 초기값 0을 갖을것이다.
{
for(i=7; i>=0; i--)//위에 for문에서 arrary[]에 저장한 0,1을 출력 위에서 역순으로 저장했기때문에
printf("%d",array1[i]); //arrary[0]부터 출력하는게 아니라ㅡ arrary[31](마지막)부터 역으로 출력
printf("\n");
}
//2진수 숫자8개를 10진수로 변환
int t = 0;
if(array1[0]==1){ t += pow(2, 0); printf("%d",array1[0]); }
if(array1[1]==1){ t += pow(2, 1); printf("%d",array1[1]); }
if(array1[2]==1){ t += pow(2, 2); printf("%d",array1[2]); }
if(array1[3]==1){ t += pow(2, 3); printf("%d",array1[3]); }
if(array1[4]==1){ t += pow(2, 4); printf("%d",array1[4]); }
if(array1[5]==1){ t += pow(2, 5); printf("%d",array1[5]); }
if(array1[6]==1){ t += pow(2, 6); printf("%d",array1[6]); }
if(array1[7]==1){ t += pow(2, 7); printf("%d",array1[7]); }
printf(" %d\n", t);
//출력 OK -------------------------
if(count==1) //입력된 수가 0보다 작거나 같았다면 처음 if문에서 iuput=-iuput, count=1; 을 거쳤기때문에
{
//iuput 가 만일 -3 이였다면 현제 iuput는 3, count는 1
for(i=7; i>=0; i--) //1의 보수를 취한다ㅡ 처음 입력한 수의 절대값에 해당하는 수를 위에서 0,1 이진수로 나타낸것을
{
if(array1[i]==0)//0이면 1로
array1[i]=1;
else//0이 아닌 1이면 0으로
array1[i]=0;
}
array1[0]+=1; //arrary[0]은 2진수로 표현했을때 맨 마지막(오른쪽) 자리다ㅡ 마지막 자리에 1을 더함으로서
//2의 보수를 취합니다.
for(i=0; i<=8; i++) //위에서 2의 보수를 취하면서 1을 더해줬기때문에 arrary[]에 0,1 뿐만 아니라 2까지 표현되있을수 있습니다.
{
if(array1[i]==2) //어떤 자리가 2일경우 2진수에서 그자리는 0이되고 , 한자리 위는 1을 더합니다.
{
array1[i]=0;
array1[i+1]+=1;
}
}
for(i=7; i>=0; i--)//이제 음수일때 2의 보수를 취하는것까지 계산이 끝난 arrary[]를 출렵합니다.
printf("%d",array1[i]); //역시 역순으로 했기때문에 arrary[31]부터 출력합니다.
printf("\n");
}
//입력 OK -------------------------
printf("정수 1개 입력: "); //생략
scanf("%d",&n2); //수를 입력받고 그 수를 iuput에 저장
if(n2<=0)//입력받은 수가 양수가 아니경우 iuput = -iuput, count=1로
n2=-n2, count=1; //count를 1로 함으로서ㅡ 나중에 처리한다. iuput을 양수화한다음 나중에 보수를 취하는 방식
for(i=0; i<=7; i++) //입력된수가 음수이든 양수이든 현제 iuput는 양수이고 그 수를 나누면서 각 비트에 0,1을 결정
{
//현제 입력된 0,1은 역순으로 입력되있다ㅡ (예: 4비트 2의 경우 0010 ==> 이 반복문에 의하면 0100)
array2[i]=n2%2; //계산과정이므로 생략
n2=n2/2;
printf("%d ", n2);
}
//입력 OK -------------------------
if(count==0) //입력된 수iuput가 0보다 크다면 위에 조건문(if문)을 안거쳤기때문에 처음 초기값 0을 갖을것이다.
{
for(i=7; i>=0; i--)//위에 for문에서 arrary[]에 저장한 0,1을 출력 위에서 역순으로 저장했기때문에
printf("%d",array2[i]); //arrary[0]부터 출력하는게 아니라ㅡ arrary[31](마지막)부터 역으로 출력
printf("\n");
}
//출력 OK -------------------------
if(count==1) //입력된 수가 0보다 작거나 같았다면 처음 if문에서 iuput=-iuput, count=1; 을 거쳤기때문에
{
//iuput 가 만일 -3 이였다면 현제 iuput는 3, count는 1
for(i=7; i>=0; i--) //1의 보수를 취한다ㅡ 처음 입력한 수의 절대값에 해당하는 수를 위에서 0,1 이진수로 나타낸것을
{
if(array2[i]==0)//0이면 1로
array2[i]=1;
else//0이 아닌 1이면 0으로
array2[i]=0;
}
array2[0]+=1; //arrary[0]은 2진수로 표현했을때 맨 마지막(오른쪽) 자리다ㅡ 마지막 자리에 1을 더함으로서
//2의 보수를 취합니다.
for(i=0; i<=8; i++) //위에서 2의 보수를 취하면서 1을 더해줬기때문에 arrary[]에 0,1 뿐만 아니라 2까지 표현되있을수 있습니다.
{
if(array2[i]==2) //어떤 자리가 2일경우 2진수에서 그자리는 0이되고 , 한자리 위는 1을 더합니다.
{
array2[i]=0;
array2[i+1]+=1;
}
}
for(i=7; i>=0; i--)//이제 음수일때 2의 보수를 취하는것까지 계산이 끝난 arrary[]를 출렵합니다.
printf("%d",array2[i]); //역시 역순으로 했기때문에 arrary[31]부터 출력합니다.
printf("\n");
x=0;
x=n1,n2;
x=x+array1[i]+array2[i];
printf("xxxxxx %d ", x);
}
//2진수 숫자8개를 10진수로 변환
int t2 = 0;
if(array2[0]==1){ t2 += pow(2, 0); printf("%d",array2[0]); }
if(array2[1]==1){ t2 += pow(2, 1); printf("%d",array2[1]); }
if(array2[2]==1){ t2 += pow(2, 2); printf("%d",array2[2]); }
if(array2[3]==1){ t2 += pow(2, 3); printf("%d",array2[3]); }
if(array2[4]==1){ t2 += pow(2, 4); printf("%d",array2[4]); }
if(array2[5]==1){ t2 += pow(2, 5); printf("%d",array2[5]); }
if(array2[6]==1){ t2 += pow(2, 6); printf("%d",array2[6]); }
if(array2[7]==1){ t2 += pow(2, 7); printf("%d",array2[7]); }
printf(" %d\n", t2);
int t3 = t + t2;
printf("%d \n", t3);
//더해진 값을 입력
x = t3;
//-값이 적용되기는 하나. 정확한지 확인이 필요함.
//덧셈 성공 -------------------------
printf("덧셈 결과는?: "); //생략
if(x<=0)//입력받은 수가 양수가 아니경우 iuput = -iuput, count=1로
x=-x, count=1; //count를 1로 함으로서ㅡ 나중에 처리한다. iuput을 양수화한다음 나중에 보수를 취하는 방식
for(i=0; i<=7; i++) //입력된수가 음수이든 양수이든 현제 iuput는 양수이고 그 수를 나누면서 각 비트에 0,1을 결정
{
//현제 입력된 0,1은 역순으로 입력되있다ㅡ (예: 4비트 2의 경우 0010 ==> 이 반복문에 의하면 0100)
array3[i]=x%2; //계산과정이므로 생략
x=x/2;
printf("%d ",array3[i]);
}
if(count==0) //입력된 수iuput가 0보다 크다면 위에 조건문(if문)을 안거쳤기때문에 처음 초기값 0을 갖을것이다.
{
for(i=7; i>=0; i--)//위에 for문에서 arrary[]에 저장한 0,1을 출력 위에서 역순으로 저장했기때문에
printf("%d",array3[i]); //arrary[0]부터 출력하는게 아니라ㅡ arrary[31](마지막)부터 역으로 출력
printf("\n");
}
if(count==1) //입력된 수가 0보다 작거나 같았다면 처음 if문에서 iuput=-iuput, count=1; 을 거쳤기때문에
{
//iuput 가 만일 -3 이였다면 현제 iuput는 3, count는 1
for(i=7; i>=0; i--) //1의 보수를 취한다ㅡ 처음 입력한 수의 절대값에 해당하는 수를 위에서 0,1 이진수로 나타낸것을
{
if(array3[i]==0)//0이면 1로
array3[i]=1;
else//0이 아닌 1이면 0으로
array3[i]=0;
}
array3[0]+=1; //arrary[0]은 2진수로 표현했을때 맨 마지막(오른쪽) 자리다ㅡ 마지막 자리에 1을 더함으로서
//2의 보수를 취합니다.
for(i=0; i<=8; i++) //위에서 2의 보수를 취하면서 1을 더해줬기때문에 arrary[]에 0,1 뿐만 아니라 2까지 표현되있을수 있습니다.
{
if(array3[i]==2) //어떤 자리가 2일경우 2진수에서 그자리는 0이되고 , 한자리 위는 1을 더합니다.
{
array3[i]=0;
array3[i+1]+=1;
}
}
for(i=7; i>=0; i--)//이제 음수일때 2의 보수를 취하는것까지 계산이 끝난 arrary[]를 출렵합니다.
printf("%d",array3[i]); //역시 역순으로 했기때문에 arrary[31]부터 출력합니다.
printf("\n");
}
return 0;
}
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변 감사드립니다.
그런데 왜? 양의 정수의 덧셈만 결과값이 나오는거죠?
혹시 이 상태에서 뺼셈은 어떻게 해야하나요?
혹시 이 상태에서 뺼셈은 어떻게 해야하나요?
저도 해봐야 알겠네요.
이거도 참고해서 한번 해보세요.
http://kldp.org/node/153671
값은 나왔으니. 출력하는 방법만 연구하시면 될것 같습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기