Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 주어진 이진수의 2의 보수 구하는 프로그램

2의 보수(Two's Complement)란?

컴퓨터에서 음수를 표현할 때 널리 사용되는 2의 보수는 주어진 이진수에 대해 다음 두 가지 방법으로 계산할 수 있습니다.

  • 방법 1 – 먼저 1의 보수(모든 비트 반전)를 구한 뒤, 여기에 1을 더합니다.

  • 방법 2 – 최하위 비트(LSB)부터 처음으로 1이 등장하는 자리까지(그 1을 포함하여)는 그대로 두고, 나머지 상위 비트들은 모두 반전시킵니다.

2의 보수를 구하는 핵심 로직

1의 보수 값에 캐리(carry)를 이용해 1을 더하는 과정은 아래와 같이 구현할 수 있습니다.

for(i = SIZE - 1; i >= 0; i--){
    if(one[i] == '1' && carry == 1){
        two[i] = '0';
    }
    else if(one[i] == '0' && carry == 1){
        two[i] = '1';
        carry = 0;
    } else {
        two[i] = one[i];
    }
}
two[SIZE] = '\0';
printf("Two's complement of binary number %s is %s\n",num, two);

1의 보수를 구하는 핵심 로직

입력받은 이진수의 각 비트를 검사하여 0은 1로, 1은 0으로 바꾸면 1의 보수가 됩니다.

for(i = 0; i < SIZE; i++){
    if(num[i] == '0'){
        one[i] = '1';
    }
    else if(num[i] == '1'){
        one[i] = '0';
    }
}
one[SIZE] = '\0';
printf("Ones' complement of binary number %s is %s\n",num, one);

예제 코드

다음은 주어진 8비트 이진수의 1의 보수와 2의 보수를 차례로 구하는 완전한 C 프로그램입니다.

#include<stdio.h>
#include<stdlib.h>
#define SIZE 8
int main(){
    int i, carry = 1;
    char num[SIZE + 1], one[SIZE + 1], two[SIZE + 1];
    printf("Enter the binary number\n");
    gets(num);
    /* 1의 보수 계산 */
    for(i = 0; i < SIZE; i++){
        if(num[i] == '0'){
            one[i] = '1';
        }
        else if(num[i] == '1'){
            one[i] = '0';
        }
    }
    one[SIZE] = '\0';
    printf("Ones' complement of binary number %s is %s\n",num, one);
    /* 1을 더해 2의 보수 계산 */
    for(i = SIZE - 1; i >= 0; i--){
        if(one[i] == '1' && carry == 1){
            two[i] = '0';
        }
        else if(one[i] == '0' && carry == 1){
            two[i] = '1';
            carry = 0;
        }
        else{
            two[i] = one[i];
        }
    }
    two[SIZE] = '\0';
    printf("Two's complement of binary number %s is %s\n",num, two);
    return 0;
}

참고: 위 코드에서 사용된 gets() 함수는 입력 길이를 제한하지 못해 버퍼 오버플로 위험이 있어 현재 C 표준에서는 제거되었습니다. 실제 프로젝트에서는 fgets(num, sizeof(num), stdin)처럼 크기를 지정하는 안전한 입력 함수를 사용하는 것이 좋습니다.

실행 결과

위 프로그램을 실행하고 이진수 1000010을 입력하면 다음과 같은 결과가 출력됩니다.

Enter the binary number
1000010
Ones' complement of binary number 1000010 is 0111101
Two's complement of binary number 1000010 is 0111110

결과 해석

입력값 1000010의 모든 비트를 반전하면 1의 보수인 0111101이 되고, 여기에 1을 더하면 2의 보수인 0111110이 됩니다. 이 값은 원래 수의 음수 표현과 같으므로, 덧셈 연산만으로 뺄셈을 처리하는 컴퓨터 산술 연산의 기본 원리가 됩니다.